搜索
bottom↓
回复: 2

二维数组遍历:下标法与指针法的较量

[复制链接]

出0入0汤圆

发表于 2010-1-31 19:03:44 | 显示全部楼层 |阅读模式
在图像的采集中,常常需要用到二维数组,这里数组的遍历是指按照一定的顺序访问数组中所有的元素。

在众多的遍历方法中,下标法和指针法是两种常用的方法。但在使用的时候,我们只需要选择其中的一种,那么如何选择呢?

相信很多人都会脱口而出:当然是指针法快啦!但实际上真的如此吗?下面我会用实验说明什么才是最快的。

由于这次面向的对象是freescale的单片机,所以编译用的IDE是Codewarrior for HCS12(X) V5.0。

为这两种方法各建立一个工程,对同样的二维数组进行遍历,然后用Hiwave Ture-Time Simulation进行仿真,分别记录下各自的执行的总时间。Hiwave中CPU执行的时间用时钟周期表示,时间越少效率越高。

好的,废话少说,开始验证……



下标法的源代码:

#include <hidef.h>     
#include "derivative.h"     

#include <stdio.h>


uchar temp;


void main(void) {

uchar a[3][4]=
  {
  {1,3,5,7},
  {9,11,13,15},
  {17,19,21,23}
  };
  uchar i,j;
  for(i=0;i<3;i++)
    for(j=0;j<4;j++)
      temp=a[j];
  for(;;) {
    _FEED_COP();
  }

}



编译通过后,进入仿真模式,在 _FEED_COP()这里设置一个断点,这样我们可以看到前面所有程序运行的总的时钟周期。

运行后的界面如下:



(原文件名:array_index.JPG)



看到任务栏的时钟周期了吧,473个Cycle。

也就是说,程序从开始执行到断点处,一共用了473个时钟周期。



接下来,我们测试一下指针法。



指针法程序代码:

#include <hidef.h>     
#include "derivative.h"     

#include <stdio.h>


uchar temp;


void main(void) {



  uchar a[3][4]=
  {
  {1,3,5,7},
  {9,11,13,15},
  {17,19,21,23}
  };
  uchar i,j;
  uchar (*p)[4]=a;
  for(i=0;i<3;i++)
    for(j=0;j<4;j++)
      temp=*(*(p+i)+j);

  for(;;) {
    _FEED_COP();
  }

}


从上面的程序可以看出,我们的程序执行的功能是一样的,只不过是用了另一种方法而已,

同样也是在_FEED_COP()这里设置一个断点,运行仿真,来一张截图:


(原文件名:array_point.JPG)



从任务栏的信息看出,执行到断点处一共用了477个Cycle。

结果摆在眼前,比起下标法多用了4个Cycle,可见是下标法更具效率



后记:

开始的时候,我也像很多人一样,在直觉上觉得指针法肯定比下标法要快,但是,对于不同架构的CPU,内存寻址的方法不一样,编译器对于用C语言指针生成的代码的实现方法也有各自的特色,对应的执行效率也不一样。



希望通过这一个小测试,能够引起大家的注意,对于没有把握的问题,不能想当然的认为,最直接的手段是通过试验来说明问题,而不是一味的猜想,这样是永远得不到正确的答案的。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2010-1-31 19:23:43 | 显示全部楼层
这个,你这指针法写的明显不够优化,我觉得应该如下写再去比较谁快谁慢
for(unsgiend long I = 0; I<i*j; I++)
{
   temp = *p++;
}
(其中i,j为你的二维数组下标)

出0入0汤圆

发表于 2010-1-31 20:04:46 | 显示全部楼层
较量啥呀,都说100遍了, a和 *(a+i) 完全等价, a[j]和*( *(a+i)+j) 完全等价。

指针运算只有在自加(减)的时候才可能快 。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 05:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表