Почему встраивание компилятора производит более медленный код, чем встраивание вручную?

Предпосылки

Следующий критический цикл части числового программного обеспечения, написанного на 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% накладных расходов времени выполнения. У меня есть вопрос:

Вопросы

  1. Почему компилятор создает другой ассемблерный код?

  2. Почему производимая сборка работает медленнее?

РЕДАКТИРОВАТЬ: На второй вопрос был дан ответ путем реализации предложения @ KamyarSouri (j% 16). Ассемблерный код теперь выглядит почти идентичным (см. http://pastebin.com/diff.php?i=yqXedtPm ). Единственные отличия заключаются в строках 18, 33, 48:

000646F9  movzx       edx,dl 

Материал

Эта диаграмма показывает FLOP / s (с точностью до коэффициента масштабирования) для 50 тестовых прогонов моего кода.

enter image description here

Скрипт 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

31
задан Mysticial 8 January 2012 в 23:07
поделиться