Операторы int != и == при сравнении с нулем

Я обнаружил, что != и == не самые быстрые способы проверки нулевого или ненулевого значения.

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 инструкции были идентичными (первые версии выглядели точно так же, как и вторые версии), но вторые версии были все же быстрее.

  1. Почему компилятор не генерирует более быструю версию на x86-32?
  2. Почему вторые версии по-прежнему быстрее на 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.

75
задан NFRCR 31 May 2012 в 19:26
поделиться