效率相差如此之大?
我运行下面两段代码,
#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;
}
i=999999;
printf( "%d\n ",*(p+i));
free(p);
}
#include <stdio.h>
#include <stdlib.h>
void main()
{
int i=1,k,*p,*end_p;
p=(int *)malloc(1000000*sizeof(int));
end_p=p+999999;
for(k=1;k <1000000001;k++)
{
for(;p <=end_p;p++)
*p=i++;
i=1;
}
p=end_p-999999;
i=999999;
printf( "%d\n ",*(p+i));
free(p);
}
前面的循环了 1000*1000000 次,屏幕显示结果时用了大约6秒钟,后者循环了
1000000000*1000000 次,显示结果用了大约4秒钟,二者效率粗略计算相差了
10W~20W倍。
请大家看看我的两个对比存在明显漏洞吗?
[解决办法]
for(k=1;k <1000000001;k++)
{
for(;p <=end_p;p++)
*p=i++;
i=1;
}
p=end_p-999999;
------------------------------
是这段代码造成了前后两个程序的语义不一样。。。
上面的代码循环1001 * 1000000次,但是下面的程序除了第一次内循环了1000000次,此时的p值
= end_p + 1,再次循环的时候p的值没有reset到end_p-999999,而是在外循环结束后才作了一次无意义的reset。所以,剩下的1000000000次内循环都只做了一次比较操作,而没有实际的*p=i++;操作。。