2016-11-07 113 views
1

我做了一些優化,並發現這一點:爲什麼for循環初始化中的條件比循環內部更快?

for (int x = -1; x < 2; x++) 
{ 
    for (int y = -1; y < 2 ; y++) 
    { 
     if (((x * x)^(y * y)) != 1) 
     { 
      continue; 
     } 
    } 
} 

時間超過兩倍的時間更多,因爲這跑:

for (int x = -1; x < 2; x++) 
{ 
    for (int y = -1; y < 2 && ((x * x)^(y * y)) == 1; y++) 
    { 

    } 
} 

這到底是怎麼回事?

目的是避免對角(-1,-1; -1,1 ...)和原點(0,0)字段

+2

你是如何測試它的? – Steve

+0

@Steve連續10次運行兩個版本1億次。調試模式 – user3488765

+1

定時測試最好使用發佈版本進行優化,而不是使用調試器,因爲最終是最重要的。 – hatchet

回答

13

第二代碼結束時內環((x * x)^(y * y)) != 1,而第一代碼只跳過內循環的一次迭代。由於他們不會做同樣的事情,所以所有的賭注都在比較表現。

+4

哎呀,我是個白癡,.. – user3488765