程式碼最佳化試驗——短迴圈最佳化(下) (轉)

gugu99發表於2007-08-15
程式碼最佳化試驗——短迴圈最佳化(下) (轉)[@more@]

測試2

#include

#include

void sum4()

{

  int j = 0;

  for (unsigned i = 1; i < 630001;)

  {

  j += i++;

  j += i++;

  j += i++;

  j += i++;

  }

}

 :namespace prefix = o ns = "urn:schemas--com::office" />

void sum5()

{

  int j = 0;

  for (unsigned i = 1; i < 630001;)

  {

  j += i++;

  j += i++;

  j += i++;

  j += i++;

  j += i++;

  }

}

int main()

{

  int i, j; Timer timer;

  timer.Start();

  for (i = 0; i < 5; i++) sum4();

  cout << "sum4  : " << timer.GetTime() << endl;

  timer.Start();

  sum4();sum4();sum4();sum4();sum4();

  cout << "sum4E : " << timer.GetTime() << endl;

  timer.Start();

  for (i = 0; i < 5; i++) sum5();

  cout << "sum5  : " << timer.GetTime() << endl;

  timer.Start();

  sum5();sum5();sum5();sum5();sum5();

  cout << "sum5E : " << timer.GetTime() << endl;

  timer.Start();

  for (i = 0; i < 100; i++) sum4();

  cout << "sum4H : " << timer.GetTime() << endl;

  timer.Start();

  for (i = 0; i < 100; i++) sum5();

  cout << "sum5H : " << timer.GetTime() << endl;

  timer.Start();

  for (i = 0; i < 1000; i++)

  for (j = 0; j < 5; j++) sum4();

  cout << "sum4T : " << timer.GetTime() << endl;

  timer.Start();

  for (i = 0; i < 1000; i++)

  {sum4();sum4();sum4();sum4();sum4();}

  cout << "sum4TE: " << timer.GetTime() << endl;

  for (i = 0; i < 1000; i++)

  for (j = 0; j < 5; j++) sum5();

  cout << "sum5T : " << timer.GetTime() << endl;

  timer.Start();

  for (i = 0; i < 1000; i++)

  {sum5();sum5();sum5();sum5();sum5();}

  cout << "sum5TE: " << timer.GetTime() << endl;

  return 0;

}

測試結果2

Sum4

Sum4E

Sum5

Sum5E

Sum4H

Sum5H

Sum4T

Sum4TE

Sum5T

Sum5TE

VC6 Release,生成大小57,344B,以下時間單位ms

8.781

8.45918

7.54705

7.54677

174.909

152.656

8672.62

8794.3

16433.9

7633.09

BCC32,生成檔案大小140,800B,以下時間單位ms

8.5874

8.91789

8.61534

7.64287

169.769

180.58

8548.64

8758.32

17586.1

7835.57

這個表是個大致趨勢,更多的資料我就不列了。這個結果頗出乎我的預料,變化很不規律,我得出以下結論,還望大家商榷:

1.  如果是單層迴圈,短迴圈不需要展開,提升不明顯。對於BCC32,更不需要展開,由於的,展開後還不如原來的。但是對於原來就很高效的,BCC32展開還是能帶來提升的。

2.  對於不能展開的單層短迴圈,VC6和迴圈體內的效能一致,BCC32由於有最佳化,結果出現了倒退。

3.  對於多層迴圈的內迴圈短迴圈,如果原來函式的效能不是很好,展開的效果並不明顯,這裡是出現了倒退。最奇怪的是原來效能最好的sum5,在不展開的情況下居然效能那麼差,展開後竟又是效能最好的了,提高了一倍多,真是怪事。

綜上,對於原來效能好的函式,短迴圈展開能提升效能;如果你對自己的程式碼沒信心,就不要展開了,有時會適得其反。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-958681/,如需轉載,請註明出處,否則將追究法律責任。

相關文章