数组下标和指针访问效率疑惑
这个问题并不是涉及“数组下表访问有乘法运算,而指针访问是没有的”这类问题,关于这个问题可以参考:
指针和下标问题
这个问题是来自对汇编输出的一个疑惑:
测试程序:
#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的操作要少一条汇编指令。
而程序运行的结果却出乎我的意料:
*ap版本竟然比a[0]还要快?
多次运行改程序后,有时候会有a[0]比*ap要快的情况,但效果并不明显。
问题出在哪里呢?
fishman
12 years, 7 months ago
Answers
指针应该是要快一些,但是这点差别实在是太小了。
简单的用指令数量来判断快慢是不对的,而且你一定用的是debug无优化的编译。对于现在的机器来讲,这方面的开销真的是微不足道了,而且数组是容易转化为指针的。由于指针访问此事和数组下标等价,很多编译器会将他们优化得一模一样。
口嫌体正直君
answered 12 years, 7 months ago