Несколько простых советов:
1) Постарайтесь минимизировать количество условных переходов, потому что они очень дорогие. Разверните, если это возможно.
2) Переупорядочить инструкции, чтобы свести к минимуму задержки из-за зависимости данных:
cmp DWORD PTR [esi],edx ;// takes some time to compute,
mov edx,DWORD PTR [esi+4] ;
ja _swap ;// waits for results of cmp
3) Избегайте старых составных инструкций (пара dec
, jnz
быстрее loop
и не привязана к регистру ecx
)
Было бы довольно сложно написать ассемблерный код, который быстрее, чем код, сгенерированный оптимизирующим компилятором C, потому что вы должны учитывать множество факторов: размер данных и кэши команд, выравнивания, конвейер, время выполнения команд. Вы можете найти хорошую документацию об этом здесь . Особенно рекомендую первую книгу: Оптимизация программного обеспечения на C ++