ARM-Linux程式碼的執行效率分析
阿新 • • 發佈:2019-01-24
- //目的:企圖定位ARM-Linux下程式執行速度緩慢的原因。
- // TYPE, 緩衝區的操作型別(比較同樣的運算規模下int8, int16, int32的執行速度差異)
- //
- // buf, 一個大小為SIZE*2(Bytes)的緩衝區
- // SIZE, 實際進行操作的緩衝區的尺寸(Bytes)(比較運算規模線性增長時,執行速度是否線性下降)
- // SPAN, 內層迴圈的尺寸(Bytes)(檢視內層迴圈的規模變化時,執行速度是否有變化)
- //
- // [備註:實驗的結果表明SPAN的變化會顯著影響程式的執行效率]
- template<class TYPE>void buff_access(
- {
- int xx = SPAN/sizeof(TYPE); //內層迴圈規模
- int yy = (SIZE/SPAN); //外層迴圈規模(計算規模=對一個(SIZE)bytes緩衝區寫入一遍)
- longtm; //計時用變數
- if((xx*yy*sizeof(TYPE)) != (unsigned
- TYPE (*theBuf)[xx] = (TYPE (*)[xx])(buf); //將傳入的緩衝區轉換為二維陣列形式
- int i, j, k;
- int *p = newint[xx]; //模擬對緩衝區隨機操作的一維緩衝區(裡面填入[0,xx]的隨機值)
- volatileint *pos;
- for(i = 0; i<xx;++i) //隨機操作模擬緩衝區初始化,您現在看到的版本是修改後的,緩衝區內容全為0
- {
- (i%2) ?
- p[i] = 0 : p[i] = 0;
- }
- SetTimeMark(tm); //計時開始
- for(k = 0; k<LOOP_TIMES; ++k) //延長執行的時間
- {
- for(i = 0; i<yy; ++i) //外層迴圈(二維緩衝區行)
- {
- pos = p; //隨機操作模擬緩衝區讀指標復位
- for(j = 0; j<xx; ++j) //內迴圈(二維緩衝區列)
- {
- theBuf[i][*pos] = 0; //模擬重新整理當前行,隨機列的內容
- ++pos; //變換列索引
- }
- }
- }
- long totalTime = GetElapseTime(tm); //計時結束
- TraceAndLog("performance.log",
- "方法:%s/n用時:%ld(us)/n緩衝區長:%d(KB)/n內層迴圈長:%f(KB)/n單元:%d(B)/n實際長度:%d(KB)/n",
- "二維陣列-重新整理",
- totalTime,
- SIZE/1024,
- ((float)SPAN)/1024,
- sizeof(TYPE),
- (yy*xx*sizeof(TYPE))/1024
- );
- delete[] p;
- }
在ARM(S3c2440), linux2.6.13上的執行結果:
SIZE = 1024*1024(1M Bytes), LOOP_TIMES = 10;
內迴圈尺寸(Bytes) | 執行時間(us) |
1K | 104580 |
2K | 93221 |
... | ... |
32K | 321554 |