2017-01-09 60 views
6

Bir boole b ve int i varsa, bu iki örnekden hangisi daha iyidir? Her iki örnekte deBoolean değerine göre değeri belirlemenin en hızlı yolu C++

int x = i-1; 
if(!b)x--; 

veya

int x; 
if(b)x = i-1;else x = i-2; 

b x doğruysa x i-2 olduğunu başka, i-1 olduğunu. x bildirimini i-1 olarak bildirmeli ve b yanlış mı, yoksa ikinci örneği mi kullanmalıyım?

+9

\ n "x = i - 2 + b; –

+4

" unun değeri yüksektir. Sürümde derleme yaparsanız, derleyici aynı kodu – user

+1

neden çıktı? Neden soruyorsunuz? Mikro optimizasyonlar gereksizdir. –

cevap

10

Derleyiciler her iki sürümü de aynı en iyi düzene göre optimize etmemişlerse şaşırırım. Bir profiler kullanarak anlamlı olduklarını kanıtlayamazsanız, zamanınızı bu mikro optimizasyonlarla boşa harcamayın.

Sorunuzu yanıtlamak için: alakasız. İşte -Ofast ile gcc.godbolt.org üzerinde "oluşturulan montaj" karşılaştırması. için derlenmiş


volatile int state0; 
volatile void f0(volatile int i, volatile bool b) 
{ 
    int x; 
    if(b)x = i-1;else x = i-2; 
    state0 = x; 
} 

... ... ... üzere


volatile int state1; 
volatile void f1(volatile int i, volatile bool b) 
{ 
    int x = i-1; 
    if(!b)x--; 
    state1 = x; 
} 

...

f0(int, bool):        # @f0(int, bool) 
     mov  dword ptr [rsp - 4], edi 
     mov  byte ptr [rsp - 5], sil 
     movzx eax, byte ptr [rsp - 5] 
     or  eax, -2 
     add  eax, dword ptr [rsp - 4] 
     mov  dword ptr [rip + state0], eax 
     ret 
derlenmiş

f1(int, bool):        # @f1(int, bool) 
     mov  dword ptr [rsp - 4], edi 
     mov  byte ptr [rsp - 5], sil 
     mov  eax, dword ptr [rsp - 4] 
     movzx ecx, byte ptr [rsp - 5] 
     or  ecx, -2 
     add  ecx, eax 
     mov  dword ptr [rip + state1], ecx 
     ret 

Gördüğünüz gibi, fark minimumdur ve derleyicinin volatile'u kaldırarak daha agresif bir şekilde optimize edilmesine izin verildiğinde ortadan kaybolması oldukça olasıdır.


İşte -Ofast -march=native -ffast-math kullanarak resim şeklinde benzer bir karşılaştırma verilmiştir: iyileştirici muhtemelen, aynı çözüme hem çözümlerini optimize edecek beri

Godbolt comparison

+0

Lütfen hangi bayrakları kullandığınızı belirtin (-O3?) –

+0

@IvanRubinson: Godbolt bağlantısında, -Ofast' kullanılır. –

+0

Teşekkürler!Sadece merak ettiğim için soruyordum. – theo2003

5

, montaj kodunu kontrol edin.

Ben bunu uygulamak gibi: okunabilmesi ve ikinci çözüm olarak eşit hale getirecek yüksek olasılıkla optimize edici için

int x = (b) ? i - 1 : i - 2; 

.

+3

"int x = i - b" yazar mıyım? 1: 2; '' 'iki kere – Slava

+1

'dan bahsetmiyorum' const int x = i - 2 + !! b' yazıp, herhangi bir dallanma olmaması için. –

+0

Yapabilirim int x = i - 2 + b 'çalışır? – theo2003