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.     long tm;                                                        //计时用变量
  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 = new int[xx];                                           //模拟对缓冲区随机操作的一维缓冲区(里面填入[0,xx]的随机值)
  18.     volatile int *pos;                                              //随机操作模拟缓冲区读指针
  19.     for(i = 0; i//随机操作模拟缓冲区初始化,您现在看到的版本是修改后的,缓冲区内容全为0
  20.     {
  21.         (i%2) ?
  22.         p[i] = 0 : p[i] = 0;
  23.     }
  24.     SetTimeMark(tm);                                               //计时开始
  25.     for(k = 0; k//延长执行的时间
  26.     {
  27.         for(i = 0; i//外层循环(二维缓冲区行)
  28.         {
  29.             pos = p;                                                //随机操作模拟缓冲区读指针复位
  30.             for(j = 0; 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处会突然出现速度变慢的情况?

你可能感兴趣的:(delete,access,float,linux,c)