Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Апрель 25, 2021, 10:10



Название: Ускорить
Отправлено: Igors от Апрель 25, 2021, 10:10
Добрый день

Есть такой метод
Код
C++ (Qt)
Channel * MyClass::SlowGetPrevChannel( const CData * dst ) const
{
 Channel * prev = 0;
 for (const auto & data : mData) {
  if (&data == dst) break;
  if (data.mChannel)
   prev = data.mChannel;
 }
 return prev;
}
И всем он хорош (особенно простотой), но увы - притормаживает. Поле mChannel меняется между вызовами. Создавать любые доп контейнеры - пожалуйста, главное убрать тормоз

Цитировать
Закурим, ребята, закурим
(ну в смысле "покажем high-end"  :))


Название: Re: Ускорить
Отправлено: Old от Апрель 25, 2021, 10:13
Двухсвязный список как раз позволяет очень быстро узнать предыдущий элемент.
Но вы то используете исключительно QVector. :(


Название: Re: Ускорить
Отправлено: Racheengel от Апрель 26, 2021, 14:05
QVector кстати сам по себе - тормоз даже по сравнению с std::vector.
А тут имхо лучше построить QMap с чилда на пэрент: QMap<CData*, CData*> childToParentMap
Т.к. QList придётся всё равно просматривать.


Название: Re: Ускорить
Отправлено: RedDog от Апрель 26, 2021, 15:06
А тут имхо лучше построить QMap с чилда на пэрент: QMap<CData*, CData*> childToParentMap
Если данных много, лучше QHash


Название: Re: Ускорить
Отправлено: Igors от Апрель 26, 2021, 15:41
QVector кстати сам по себе - тормоз даже по сравнению с std::vector.
А тут имхо лучше построить QMap с чилда на пэрент: QMap<CData*, CData*> childToParentMap
Т.к. QList придётся всё равно просматривать.
mData - любой контейнер прямого доступа (конкретно у меня QList). Только никаких парент-чайлд нема :'( И я о них ничего и не говорил. Что предлагается строить? ???


Название: Re: Ускорить
Отправлено: Racheengel от Апрель 27, 2021, 13:57
Не, тогда пожалуйста детальное описание данных и условие задачи в студию :) а то код похож на говнокод с багом, честно говоря...


Название: Re: Ускорить
Отправлено: Igors от Апрель 27, 2021, 15:44
Не, тогда пожалуйста детальное описание данных и условие задачи в студию :) а то код похож на говнокод с багом, честно говоря...
Как же Вы заблудились в ровно 10 строках (включая скобки и объявление) простого, без всяких наворотов, кода  ??? Что вызвало такое "непонимание"?  :) Лень во что-то вникнуть, лень посчитать даже на один ход вперед, вообще все лень. Так приходит старость..


Название: Re: Ускорить
Отправлено: Igors от Апрель 28, 2021, 13:48
Случай досадный, бывают такие. Неск строк совершенно дубового кода делают все что нужно, правда ценой производительности. Но как сделать без перебора - не вижу. Выдавил из себя такое

- в каждый эл-т mData вписать его индекс и при поиске просматривать вверх от этого индекса.

Ну это будет работать пока нет удалений/вставок в mData между поисками. И сейчас их действительно нет, но увы - нет и никаких гарантий что они не понадобятся :'(. Да и ускорение сомнительно, напр на старте все mChannel нулевые, и придется какое-то время побегать по mData пока они не заполнятся.

Самое время заводить говнокодерскую песню о "преждевременной оптимизации", ну или там про "область применения" и.т.п. Но мы же не такие, правда?  :)