ARM-Linux代码的执行效率分析

59 篇文章 0 订阅
41 篇文章 2 订阅
  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<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)
1K104580
2K93221
......
32K321554
为什么在32K处会突然出现速度变慢的情况?
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子正

thanks, bro...

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值