SORU
31 Mayıs 2012, PERŞEMBE


operatörler=! int ve == sıfır karşılaştırırken

O= buldum! ve == test etmek için en hızlı yol değildir sıfır ya da sıfır.

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

Derleyici: VC 11 Optimizasyon bayrakları: /O2 /GL /LTCG

Bu x 86-32 montaj çıktı. Her iki karşılaştırma İkinci Sürüm ~12% daha hızlı x 86-x 86 32-64 de vardı. Ancak, 86-64 talimatları aynıydı (ilk sürümleri tam olarak ikinci sürümleri gibi görünüyordu), ama ikinci sürümleri hala daha hızlı.

  1. Neden derleyici 86-32 hızlı sürümü oluşturmak değil mi?
  2. Neden ikinci sürümleri hala montaj çıktı aynı olduğunda 86-64 daha hızlı.

EDİT: kıyaslama kod ekledim. SIFIR: 1544ms, 1358ms NON_ZERO: 1544ms, 1358ms http://pastebin.com/m7ZSUrcP ya http://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7ZSUrcP

Not: muhtemelen tek bir kaynak dosya içinde derlenmiş bu fonksiyonları bulmak için, ana zahmetli çünkü.Migros çok büyük bir gider. Ayrı bir kaynak dosyada zero1, zero2, nonZero1, nonZero2 vardı.

EDİT2: 11 VC ve VC 2010 hem birisi yüklü kıyaslama kodu çalıştırın ve zamanlamaları sonrası Olabilir? Gerçekten VC 11 Bir hata olabilir.

CEVAP
31 Mayıs 2012, PERŞEMBE


Bu büyük bir soru, ama kurban derleyici bağımlılık analizi için düştün sanırım.

Derleyici yalnızca eax yüksek bitleri temizlemek için vardır, ve ikinci versiyonu için açık kalır. İkinci Sürüm derleyici analiz ilk sürümü tarafından temizlendi kaldı kanıtladı dışında xor eax, eax için bedel ödemek zorunda kalacak.

İkinci versiyonu "" ilk sürümü derleyici mi işe yararlanarak. hile yapabiliyor

Nasıl ölçüyorsun? Bu "döngü(sürüm, Sürüm iki ve ardından)" veya "(bir döngü sürüm) (Sürüm bir döngüde iki) izledi".

Yapma her iki testte aynı programı (yerine yeniden derlemek için her sürüm), ya da eğer sen yapmak, test de "ilk sürüm" ve "versiyon B" bakalım hangisi önce gelir. para cezası.


Bu hile örnek:

timer1.start();
double x1 = 2 * sqrt(n   37 * y   exp(z));
timer1.stop();
timer2.start();
double x2 = 31 * sqrt(n   37 * y   exp(z));
timer2.stop();

Eğer timer2 süresi timer1 süre daha az ise, 31 ile çarparak 2 ile çarparak daha hızlı sonuç yok. Bunun yerine, derleyici ortak ifadeyi analizi yapıldı ve kod oldu farkındayız:

timer1.start();
double common = sqrt(n   37 * y   exp(z));
double x1 = 2 * common;
timer1.stop();
timer2.start();
double x2 = 31 * common;
timer2.stop();

Ve tek şeyi kanıtladı 31 çoğalıyor common bilgisayar daha hızlı olmasıdır. Neredeyse tüm çarpma şaşırtıcı olduğu kadar sqrt exp den çok daha hızlıdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Chaoticmoogle

    Chaoticmoogl

    13 ŞUBAT 2006
  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008