Son zamanlarda garip bir sorunla karşılaştığımda kişisel bir proje üzerinde çalışıyordum.
Çok sıkı bir döngüde 0 ve 15 arasında bir değere sahip bir tamsayı var. 0, 1, 8 ve 9 değerleri için -1 ve 4, 5, 12 ve 13 değerleri için 1 almam gerekiyor.
Birkaç seçeneği kontrol etmek için godbolt'a döndüm ve derleyicinin bir if deyimi ile aynı şekilde bir anahtar deyimini optimize edemediğine şaşırdım.
Bağlantı burada: https://godbolt.org/z/WYVBFl
Kod:
const int lookup[16] = {-1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0};
int a(int num) {
return lookup[num & 0xF];
}
int b(int num) {
num &= 0xF;
if (num == 0 || num == 1 || num == 8 || num == 9)
return -1;
if (num == 4 || num == 5 || num == 12 || num == 13)
return 1;
return 0;
}
int c(int num) {
num &= 0xF;
switch (num) {
case 0: case 1: case 8: case 9:
return -1;
case 4: case 5: case 12: case 13:
return 1;
default:
return 0;
}
}
B ve c'nin aynı sonuçları vereceğini düşünürdüm ve çözümüm (anahtar ifadesi - başka bir formda) oldukça yavaş olduğu için kendimi verimli bir uygulama bulmak için bit-hack'leri okuyabileceğimi umuyordum.
Garip bir şekilde, b
bit hack'lerine derlendiğinde c
ya neredeyse optimize edilmemişti ya da a
hedef donanıma bağlı olarak farklı bir duruma indirgenmişti .
Herkes neden bu tutarsızlık olduğunu açıklayabilir mi? Bu sorguyu optimize etmenin 'doğru' yolu nedir?
DÜZENLE:
açıklama
Ben istiyorum anahtar çözümü en hızlı ya da benzer "temiz" çözüm olarak. Ancak makinemdeki optimizasyonlarla derlendiğinde, if çözümü önemli ölçüde daha hızlıdır.
Göstermek için hızlı bir program yazdım ve TIO'nun yerel olarak bulduğum sonuçlarla aynı sonuçları var: Çevrimiçi deneyin!
İle static inline
arama tablosu biraz hızlandırır: çevrimiçi deneyin!
if
yine de atıyor switch
(garip bir şekilde arama daha da hızlı hale geliyor) [Takip etmek için TIO]
-O3
derledimc
ve muhtemelen daha kötü bir şey derledia
veyab
(c
iki koşullu atlama artı birkaç bit manipülasyon, vs sadece bir koşullu atlama ve daha basit bit manip için vardıb
), ama yine de madde testleri ile saf madde daha iyi. Burada gerçekten ne istediğini bilmiyorum; Basit gerçek bir optimize derleyici açabilirsiniz olmasıdır herhangi içine bunlardan herhangi eğer o seçer böylece başkalarının ve bu yayın yapmayacağım ne için hiçbir sert ve hızlı kurallar vardır.