1

有下面兩種情況之間的性能差異:
第一:以下兩種情況有什麼不同?

int test_some_condition(void); 

if(some_variable == 2 && test_some_condition()) 
{ 
    //body 
} 

二:

int test_some_condition(void); 

if(some_variable == 2) 
{ 
    if(test_some_condition()) 
    { 
     //body 
    } 
} 

更新:我知道如何創建一個測試和測量性能或者看看爲每個案例生產的程序集,但我相信我不是第一個遇到這個問題的人,如果已經測試過的人會很棒這可以是我一個簡單的是/否的答案。

+1

把自己的編譯器作者的鞋。你將如何實現'&&'? –

+0

運行每次測試幾百萬次並測量找出的時間。編譯並查看使用'objdump'生成的彙編程序 –

+2

即使存在差異,再添加一級縮進通常也不值得提高性能。 –

回答

2

任何人都可以真正用現代編譯器講解的唯一方法就是看機器代碼。

2

應該沒有區別。 如果存在差異,則可能無法衡量(即使您做了數百萬次,也不會得出確鑿的結果)。

0

如果你正在考慮的第一個版本是否總是調用test_some_condition但第二個版本稱它只有當第一個條件爲真,那麼答案是,因爲與運營商懶惰,不會評估兩個版本是等價的其第二個論點,如果第一個已經是假的。

該標準保證了這一行爲。這使得它合法地說:

if (array_size > n && my_array[n] == 1) { ... } 

這將是沒有懶惰保證的破壞代碼。

+0

我知道。謝謝。 – binW

0

這兩個樣本在邏輯上是等效的,前提是化合物條件被延遲評估,這意味着在a && b,已知是錯誤的時候將不會評估b。所以,即使有區別,我也不會在意,因爲這可能是您使用的編譯器的一個artefact(或一個bug),它可能隨着下一個版本或bug修正而改變。

4

差別在哪些方面?

可讀性?是的,有區別。第一個更清晰,更好地表達你的意圖。而且它在編輯器中佔用的行數也更少,這本身並不是一個好處,但它確實使代碼更容易閱讀,並且一眼就能看到任何後來想要編輯它的人。

性能/「速度」?不,我會願意賭實際的錢,一旦你通過編譯器運行這兩個代碼片段並打開了優化,絕對不會有明顯的差異。即使優化已禁用,說服我下注同樣的案例也不費吹灰之力。

爲什麼?因爲在C(以及我所知道的所有C語言派生語言)中,運營商執行短路評估,這意味着如果第一個條件評估爲false,那麼它甚至不費心評估第二個條件,因爲整個陳述都不可能是真實的。

And運營商不執行短路評估時,嵌套if語句是VB 6糟糕的舊日子中常見的「優化」技巧。除非提高可讀性,否則我無法想象在C代碼中使用它。說實話,如果你運行一個編譯器,不會渲染這兩個代碼片段在性能方面完全等價,那麼現在是時候拋開該編譯器並停止使用它。這是在陽光下最基本的優化,對於編譯器編寫者來說是一個「低下的成果」。如果他們不能得到這個權利,我不會信任他們的其他代碼。

但是,一般來說,擔心這種事情(絕對屬於「微優化」類別)並不能幫助您編寫更好的代碼或成爲更好的程序員。這隻會讓您浪費大量時間在Stack Overflow上提出問題,併爲像我這樣的用戶提供相同的問題,這些問題每週都會發布相同的問題。那是時候你是而不是花時間編寫代碼並以實際方式提高你的技能。

1

測試運行10.000.000次的循環這兩個例子給出了:

$ time ./test1 

real 0m0.045s 
user 0m0.044s 
sys  0m0.001s 

$ time ./test2 

real 0m0.045s 
user 0m0.043s 
sys  0m0.003s 

另外,請記住,如果表達式的第一個部分出現故障,第二個表達式將永遠不會被評估。第一個例子中可能不太清楚。

此外,在條件,其中第一計算的表達式返回false:

$ time ./test1_1 

real 0m0.035s 
user 0m0.034s 
sys  0m0.001s 
$ time ./test2_1 

real 0m0.035s 
user 0m0.034s 
sys  0m0.000s 
+0

所以,等價。注意不要讓這樣的合成「基準」變得具有誤導性。並請原諒我的無知,但什麼是「真實」,「用戶」和「系統」? –

+0

如果一種方法比另一種方法更快,基準並不意味着什麼,而只是一個指標。 [file](http://unixhelp.ed.ac.uk/CGI/man-cgi?time)有一個手冊頁。實數是經過的秒數,用戶是在用戶模式下花費的時間,sys是在內核模式下花費的時間 –