数组下标和指针访问效率疑惑


这个问题并不是涉及“数组下表访问有乘法运算,而指针访问是没有的”这类问题,关于这个问题可以参考: 指针和下标问题
这个问题是来自对汇编输出的一个疑惑:
测试程序:

   
  #include <windows.h>
  
#include <stdio.h>

int main()
{
int a[] = {10,20,30};
int* ap = a;

long counter;

int start_time, end_time;
int index;

start_time = GetTickCount();
for (counter = 1000000000L; counter>0; counter--)
{
*ap = 100;
}
end_time = GetTickCount();
printf("10 billion times of *ap = %d\n", end_time-start_time);

start_time = GetTickCount();
for (counter = 1000000000L; counter>0; counter--)
{
a[0] = 101;
}
end_time = GetTickCount();
printf("10 billion times of a[0] = %d\n", end_time-start_time);

return 0;
}

测试程序非常简单,就是单纯地测试指针和数据名赋值的效率。
下面是VS2008,debug下的汇编输出:

   
  ; 21   :    {
  
; 22 : *ap = 100;

mov eax, DWORD PTR _ap$[ebp]
mov DWORD PTR [eax], 100 ; 00000064H

; 23 : }
.
.
.
; 29 : {
; 30 : a[0] = 101;

mov DWORD PTR _a$[ebp], 101 ; 00000065H

; 31 : }

很明显地发现,a[0]的操作要比*ap的操作要少一条汇编指令。
而程序运行的结果却出乎我的意料:

   
  10 billion times of *ap = 2995
  
10 billion times of a[0] = 3136

*ap版本竟然比a[0]还要快?
多次运行改程序后,有时候会有a[0]比*ap要快的情况,但效果并不明显。

   
  10 billion times of *ap = 2979
  
10 billion times of a[0] = 2949

问题出在哪里呢?

c 汇编

fishman 12 years, 7 months ago

指针应该是要快一些,但是这点差别实在是太小了。
简单的用指令数量来判断快慢是不对的,而且你一定用的是debug无优化的编译。对于现在的机器来讲,这方面的开销真的是微不足道了,而且数组是容易转化为指针的。由于指针访问此事和数组下标等价,很多编译器会将他们优化得一模一样。

参考资料:
用数组和指针访问数据,哪个快
为什么说指针法要比下标法访问数组速度快

口嫌体正直君 answered 12 years, 7 months ago

Your Answer