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ı.
- Neden derleyici 86-32 hızlı sürümü oluşturmak değil mi?
- 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
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.
Ondalık amacı nedir.Bir, Ondalık.Ondal...
Mantıksal operatörler ("ve",...
Biçim dizesi, sıfır sıfır tamsayı...
Test sıfır bash uzunlukta dize: [ -n "...
Nasıl bir liste ve değerleri anahtarla...