Доброго времени суток! Решил ради спортивного интереса протестировать работу циклов на Vtune. Наваял вот такую мини прогу на асме: Код (Text): call proc1 call proc2 invoke ExitProcess,NULL proc1 proc mov ecx,1000000000 xor eax,eax ee1: inc eax loop ee1 ret proc1 endp proc2 proc mov ecx,1000000000 xor eax,eax cc1: inc eax dec ecx jne cc1 ret proc2 endp И был удивлен результатом работы Vtune ee1 48,33% cc1 48,13% Если мне не изменят память здесь неоднократно упоминалось что команда loop очень медленная для организации циклов, однако на деле оказывается что выигрыш ничтожен, почему так получается?
Может быть, дело в том, что в первом случае INC и LOOP спариваются на конвеерах, а во втором остаётся "лишний" JNE (INC и DEC тож могут спариться)? Впрочем, инк и дек, опять же, более тормознутые нежели ADD/SUB 1 на процах класса Pentium и далее.
DEEP Строго говоря INC и LOOP не могут "спариваться", поскольку и INC и тем более LOOP сложные инструкции состоящие из нескольких микроопераций (мопов), поэтому могут спариваться только отдельные мопы этих инструкций. А вот замечание насчет INC и DEC совершенно верное - если заменить их на ADD и SUB, то второй код станет быстрее первого
Честно признаться не думал что inc медленнее чем add для меня это новость, где можно читнуть про то какая команда быстрее другой? (еще бы и в виде таблички )
ADD переписывает весь регистр флагов и поэтому не зависит от его пред.состояния. Inc должна сохранить предыдущее значение флага CF => зависит по флагам от пред.инструкции и => состоит из двух микроопераций - одна делает ADD, вторая комбинирует новые флаги со старым CF Для разных процев в "полном собрании сочинений" А.Фога instruction_tables.pdf Конкретно для AMD и Intel в их официальных Optimization manual-ах (у AMD подробно, у Intel выборочно)