p++的效率惊人解决方案

p++的效率惊人我今天运行下面这两段代码,发现用p++,比用p+i效率高10W~20W倍。#includestdio.h#includest

p++的效率惊人
我今天运行下面这两段代码,发现用   p++   ,比用   p+i   效率高10W~20W倍。

#include   <stdio.h>
#include   <stdlib.h>
void   main()
{
int   i=1,j,k,*p;
p=(int   *)malloc(1000000*sizeof(int));
for(k=1;k <1001;k++)
{
for(j=0;j <1000000;j++)
*(p+j)=i++;
i=1;
}
printf( "%d\n ",*(p+999999));
}


#include   <stdio.h>
#include   <stdlib.h>
void   main()
{
int   i=1,k,*p,*end_p;
p=(int   *)malloc(1000000*sizeof(int));
end_p=p+1000000;
for(j=1;k <1000000001;k++)
{
for(;p <end_p;p++)
*p=i++;
i=1;
}
printf( "%d\n ",*(end_p-1));
}

想请教大家,有人觉得这样对比的可行性有问题吗?

[解决办法]
个人觉得问题出在*(p+j) 和*p身上,且看两者生成代码
*(p+j)=i++;
00401075 mov edx,dword ptr [ebp-8]
00401078 mov eax,dword ptr [ebp-10h]
0040107B mov ecx,dword ptr [ebp-4]
//由于寻址时用到了乘法,会造成运行速度变慢
0040107E mov dword ptr [eax+edx*4],ecx
//以下三行实现i的自加运算
00401081 mov edx,dword ptr [ebp-4]
00401084 add edx,1
00401087 mov dword ptr [ebp-4],edx
0040108A jmp main+53h (00401063)

11: *p=i++;
00401078 mov ecx,dword ptr [ebp-0Ch]
0040107B mov edx,dword ptr [ebp-4]
//这里采用直接寻址的方法,速度会比较快
0040107E mov dword ptr [ecx],edx
//以下三行实现i的自加运算
00401080 mov eax,dword ptr [ebp-4]
00401083 add eax,1
00401086 mov dword ptr [ebp-4],eax
00401089 jmp main+57h (00401067)
两者的寻址方式不同,且前者进行了乘法运算(并且乘速较大),应该是这部分造成的效率问题,而并不在于p+j和p++上,因为两者最终都是生成的代码形式都是:
mov eax, dword ptr [地址]
add eax, 1/j //++为1,+j为j
mov dword ptr [地址], eax
而并没有直接调用汇编语言的
inc eax之类进行自加,不在在效率问题。以下是个例子。
3: i++;
0040102F mov eax,dword ptr [ebp-4]
00401032 add eax,1
00401035 mov dword ptr [ebp-4],eax
4: i=i+2;
00401038 mov ecx,dword ptr [ebp-4]
0040103B add ecx,2
0040103E mov dword ptr [ebp-4],ecx

[解决办法]
不要自己计算时间,教你个方法:

(包含windows.h)

SYSTEMTIME tm_begin,tm_end;
GetSystemTime(&tm_begin);
//......
//这里是你自己的代码
//......
GetSystemTime(&tm_end);
//输出前后的时刻,自己减一下就好了
cout < <tm_begin.wSecond < < '. ' < <tm_begin.wMilliseconds < <endl;
cout < <tm_end.wSecond < < '. ' < <tm_end.wMilliseconds < <endl;