Проблема с inline

267
03 мая 2017, 11:41

Здравствуйте! Пишу обработчик для WM_MOUSEMOVE для своего элемента UI. Есть массив этих элементов UI Сol *col[100000]={NULL}, часть которого не NULL. Так вот, если ниже приведённый код(обработчик) находиться непосредственно в case WM_MOUSEMOVE: то с производительностью всё нормально. Но если обернуть обработчик в функцию находящуюся в хидере, и в MOUSEMOVE просто вызывать её, то производительность значительно падает(лагает короче). Уже перепробовал и inline и __forceinline inline, ничего не помогает..

Тут можно что-то сделать?

Код

elem.h

__forceinline inline void MouseMove(HWND hwnd,LPARAM lp,RECT rr)
{
for (int i(0); i < col_count; i++)
    if (col[i])
            if (col[i]->Hover(LOWORD(lp), HIWORD(lp)) == 1 && !col[i]->bold)
            {
                col[i]->Bold();
                rr.left = col[i]->x;
                rr.top = col[i]->y;
                rr.right = col[i]->x + col[i]->cx + 1;
                rr.bottom = col[i]->y + col[i]->cy;
                InvalidateRect(hwnd, &rr, 0);
                UpdateWindow(hwnd);
            }
            else if (!col[i]->Hover(LOWORD(lp), HIWORD(lp)) && col[i]->bold)
            {
                col[i]->Bold();
                rr.left = col[i]->x;
                rr.top = col[i]->y;
                rr.right = col[i]->x + col[i]->cx + 1;
                rr.bottom = col[i]->y + col[i]->cy;
                InvalidateRect(hwnd, &rr, 0);
                UpdateWindow(hwnd);
            }
}

main.cpp

#inlcude"elem.h"
...//где-то в WndProc
case WM_MOUSEMOVE:
MouseMove(hwnd,lp,rr);
break;
...
Answer 1

Сомнителен сам принцип хранения - массив из 100000 указателей, которые еще и обрабатываются при MOUSEMOVE. Даже в этом варианте имеет смысл ненулевые собирать в начале, и прерывать цикл при обнаружении первого нулевого.

Если вы реально видите разницу между функцией и руками вставленным кодом - поработайте с профайлером, чтоб понять, где узкое место. Но самая большая оптимизация - это оптимизация алгоритмов и структур данных. Вот все же, сколько у вас реально ненулевых указателей в массиве? Может, тот же список был бы эффективнее?

И еще - ну зачем этот дубляж кода? Раз уж вы проверяете

col[i]->Hover(LOWORD(lp), HIWORD(lp)) == 1

то делаю вывод, что ваши флаги принимают значения 0 и 1 - а тогда проще сделать одну ветку как

if (col[i]->Hover(LOWORD(lp), HIWORD(lp)) + col[i]->bold == 1)

и не мучиться с дублированием кода.

READ ALSO
Смена языка сообщения error_code в boost

Смена языка сообщения error_code в boost

Когда я получаю ошибку в бусте, я могу ее прочитать, вызвав метод error_code::message()Я бы хотел, чтобы она выводилась на английском (сейчас она выводится...

281
Стэк не работает

Стэк не работает

Хотелось бы вывести 4 3 2 1 0Но ничего не выводит

285
Ошибка в программе. Некорректный вывод

Ошибка в программе. Некорректный вывод

Помогите пожалуйстаФункция должна выводить слово(слова) минимальной длины

282
Объединение двумерных строк с помощью strcat в цикле

Объединение двумерных строк с помощью strcat в цикле

Почему strcat в цикле добавляет содержимое второго массива (аргумента) в первый несколько раз, как показано на картинке

275