У меня проблема с производительностью в узком месте кода. По сути, это простой вложенный цикл.
Профилирование проблемы показывает, что программа тратит много времени просто на увеличение обоих счетчиков циклов (++) и проверку завершения (i/j ‹ 8).
Наблюдая за выводом сборки, я вижу, что оба счетчика не получают регистры, и доступ к ним стоит много циклов. Использование ключевого слова «register» не убеждает компилятор фактически помещать их в регистры. можно ли что-то сделать, чтобы оптимизировать время доступа к счетчикам?
Вот результат сборки. Исходный код C представляет собой простой вложенный цикл со счетчиками i/j.
2738 0.2479 2459 0.1707 : 1e6c: jne 1dd1 <process_hooks+0x121>
1041 0.0942 1120 0.0778 : 1e72: addl $0x1,0xffffffd4(%ebp)
2130 0.1928 2102 0.1459 : 1e76: cmpl $0x8,0xffffffd4(%ebp)
2654 0.2403 2337 0.1622 : 1e7a: jne 1da0 <process_hooks+0xf0>
809 0.0732 814 0.0565 : 1e80: jmp 1ce2 <process_hooks+0x32>
Как и просили, вот код C. Компилятор gcc кстати:
for (byte_index=0; byte_index < MASK_SIZE / NBBY; byte_index++)
{
if (check_byte(mask,byte_index))
{
for (bit_index=0; bit_index < NBBY; bit_index++)
{
condition_index = byte_index*NBBY + bit_index;
if (check_bit(condition_mask,condition_index))
{
.
.
.
}
}
}
}
Спасибо
LOOP
в x86). - person Pavel Minaev   schedule 30.07.2009