Следующий критический цикл части числового программного обеспечения, написанного на C ++, в основном сравнивает два объекта по одному из их членов:
for(int j=n;--j>0;)
asd[j%16]=a.e
a
и b
] относятся к классу ASD
:
struct ASD {
float e;
...
};
Я исследовал эффект помещения этого сравнения в облегченную функцию-член:
bool test(const ASD& y)const {
return e
и использовал его следующим образом:
for(int j=n;--j>0;)
asd[j%16]=a.test(b);
Компилятор встраивает эту функцию, но проблема в том, что код сборки будет другим и вызовет> 10% накладных расходов времени выполнения. У меня есть вопрос:
Почему компилятор создает другой ассемблерный код?
Почему производимая сборка работает медленнее?
РЕДАКТИРОВАТЬ: На второй вопрос был дан ответ путем реализации предложения @ KamyarSouri (j% 16). Ассемблерный код теперь выглядит почти идентичным (см. http://pastebin.com/diff.php?i=yqXedtPm ). Единственные отличия заключаются в строках 18, 33, 48:
000646F9 movzx edx,dl
Эта диаграмма показывает FLOP / s (с точностью до коэффициента масштабирования) для 50 тестовых прогонов моего кода.
Скрипт gnuplot для создания графика: http://pastebin.com/8amNqya7
Параметры компилятора:
/ Zi / W3 / WX- / MP / Ox / Ob2 / Oi / Ot / Oy / GL / D "WIN32" / D "NDEBUG" / D "_CONSOLE" / D "_UNICODE" / D "UNICODE" / Gm- / EHsc / MT / GS- / Gy / arch: SSE2 / fp: precision / Zc : wchar_t / Zc: forScope / Gd / analysis-
Параметры компоновщика: / ДОПОЛНИТЕЛЬНО: НЕТ "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" " uuid.lib "" odbc32.lib "" odbccp32.lib "/ ALLOWISOLATION / MANIFESTUAC:" level = 'asInvoker' uiAccess = 'false' "/ SUBSYSTEM: CONSOLE / OPT: REF / OPT: ICF / LTCG / TLBID: 1 / DYNAMICBASE / NXCOMPAT / MACHINE: X86 / ERRORREPORT: QUEUE