У меня проблема с производительностью в узком месте в моем коде. В основном это простой вложенный цикл.
Профилирование проблемы показывает, что программа тратит много времени, просто увеличивая оба счетчика циклов (++) и тестирование для завершения (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 btw:
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))
{
.
.
.
}
}
}
}
Спасибо