Я обнаружил, что != и == не самые быстрые способы проверки нулевого или ненулевого значения.
bool nonZero1 = integer != 0;
xor eax, eax
test ecx, ecx
setne al
bool nonZero2 = integer < 0 || integer > 0;
test ecx, ecx
setne al
bool zero1 = integer == 0;
xor eax, eax
test ecx, ecx
sete al
bool zero2 = !(integer < 0 || integer > 0);
test ecx, ecx
sete al
Компилятор: VС++ 11 Флаги оптимизации: /O2 /GL /LTCG
Это вывод сборки для x86-32. Вторые версии обоих сравнений были примерно на 12% быстрее как на x86-32, так и на x86-64. Однако на x86-64 инструкции были идентичными (первые версии выглядели точно так же, как и вторые версии), но вторые версии были все же быстрее.
РЕДАКТИРОВАТЬ: я добавил код бенчмаркинга. ZERO: 1544 мс, 1358 мс NON_ZERO: 1544 мс, 1358 мс http://pastebin.com/m7ZSUrcP или http://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7ZSUrcP
Примечание. Вероятно, неудобно размещать эти функции при компиляции в одном исходном файле, потому что main.asm довольно большой. У меня было ноль1, ноль2, ненулевой1, ненулевой2 в отдельном исходном файле.
EDIT2: Может ли кто-нибудь, у кого установлены как VC++11, так и VC++2010, запустить код бенчмаркинга и опубликовать тайминги? Это действительно может быть ошибка в VC++11.