1. 程式人生 > >ARM-Linux程式碼的執行效率分析

ARM-Linux程式碼的執行效率分析

  1. //目的:企圖定位ARM-Linux下程式執行速度緩慢的原因。
  2. //  TYPE, 緩衝區的操作型別(比較同樣的運算規模下int8, int16, int32的執行速度差異)
  3. //
  4. //  buf, 一個大小為SIZE*2(Bytes)的緩衝區
  5. //  SIZE, 實際進行操作的緩衝區的尺寸(Bytes)(比較運算規模線性增長時,執行速度是否線性下降)
  6. //  SPAN, 內層迴圈的尺寸(Bytes)(檢視內層迴圈的規模變化時,執行速度是否有變化)
  7. //
  8. // [備註:實驗的結果表明SPAN的變化會顯著影響程式的執行效率]
  9. template<class TYPE>void buff_access(
    void *buf, int SIZE, int SPAN)
  10. {
  11. int xx = SPAN/sizeof(TYPE);                                     //內層迴圈規模
  12. int yy = (SIZE/SPAN);                                           //外層迴圈規模(計算規模=對一個(SIZE)bytes緩衝區寫入一遍)
  13. longtm;                                                        //計時用變數
  14. if((xx*yy*sizeof(TYPE)) != (unsigned 
    int)SIZE) return;          //保證在調整SPAN的大小時,計算規模不變
  15.     TYPE (*theBuf)[xx] = (TYPE (*)[xx])(buf);                       //將傳入的緩衝區轉換為二維陣列形式
  16. int i, j, k;
  17. int *p = newint[xx];                                           //模擬對緩衝區隨機操作的一維緩衝區(裡面填入[0,xx]的隨機值)
  18. volatileint *pos;                                              
    //隨機操作模擬緩衝區讀指標
  19. for(i = 0; i<xx;++i)                                            //隨機操作模擬緩衝區初始化,您現在看到的版本是修改後的,緩衝區內容全為0
  20.     {
  21.         (i%2) ?
  22.         p[i] = 0 : p[i] = 0;
  23.     }
  24.     SetTimeMark(tm);                                               //計時開始
  25. for(k = 0; k<LOOP_TIMES; ++k)                                   //延長執行的時間
  26.     {
  27. for(i = 0; i<yy; ++i)                                       //外層迴圈(二維緩衝區行)
  28.         {
  29.             pos = p;                                                //隨機操作模擬緩衝區讀指標復位
  30. for(j = 0; j<xx; ++j)                                   //內迴圈(二維緩衝區列)
  31.             {
  32.                 theBuf[i][*pos] = 0;                                //模擬重新整理當前行,隨機列的內容
  33.                 ++pos;                                              //變換列索引
  34.             }
  35.         }
  36.     }
  37. long totalTime = GetElapseTime(tm);                             //計時結束
  38.     TraceAndLog("performance.log",
  39. "方法:%s/n用時:%ld(us)/n緩衝區長:%d(KB)/n內層迴圈長:%f(KB)/n單元:%d(B)/n實際長度:%d(KB)/n",
  40. "二維陣列-重新整理",
  41.                 totalTime,
  42.                 SIZE/1024,
  43.                 ((float)SPAN)/1024,
  44. sizeof(TYPE),
  45.                 (yy*xx*sizeof(TYPE))/1024
  46.                 );
  47. delete[] p;
  48. }

在ARM(S3c2440), linux2.6.13上的執行結果:

SIZE = 1024*1024(1M Bytes),  LOOP_TIMES = 10;

內迴圈尺寸(Bytes) 執行時間(us)
1K 104580
2K 93221
... ...
32K 321554
為什麼在32K處會突然出現速度變慢的情況?