我运行了以下内容:
#include <stdio.h>
typedef unsigned short boolean;
#define false 0
#define true (!false)
int main()
{
int STATUS = 0;
int i = 0;
boolean ret = true;
for(i = 0; i < 99999; i++)
{
ret = ret && printf("Hello, World.");
}
if(!ret)
{
STATUS = -1;
}
return STATUS;
}
它在不到一秒钟内完成。通常为0.9 - 0.92。
然后我将int i = 0;
更改为int *i = 0;
,现在我的执行时间不到0.2秒。为什么速度变化?
答案 0 :(得分:10)
您的运行时间主要是打印到控制台所需的时间。 int ++上的i ++将指针增加指针的大小。根据您的计算机和编译器设置,这将是4或8。根据你报告的数字,大概是4.所以printf的执行次数只有四分之一。
答案 1 :(得分:2)
通常情况下,打印到控制台将比任何增益大几个数量级,您可以对这样的循环进行微优化。
你真的确定你的第二个版本也打印了99999次问候世界吗?
当你正在做for(int *i = 0; i++ ; i < 99999 )
时,如果指针值(一个地址)小于99999,那你就是在唠叨,这通常没有多大意义。递增指针意味着你将它向上移动以指向下一个元素,并且由于你有一个int *,你将通过sizeof(int)bytes增加指针。
你只是迭代99999 / sizeof(int)次。
答案 2 :(得分:2)
你对nos答案的评论证实了我的怀疑:它是指针算法。当你使用int
增加++
指针时,它不只是向数字添加一个,而是实际上按整数的大小跳跃,通常是4(字节)。因此,i++
实际上是将i
的数值加4。
同样,如果您在指针上使用+=
,例如i += 5
,它就不会只为i
的数值添加5(或其他),它会提前i
乘以许多整数的大小,因此在这种情况下5 * 4 = 20个字节。
这背后的原因是,如果你有一大块内存,你将其视为数组,
int array[100]; // for example
你可以通过递增指针迭代数组中的元素。
int* i = array;
int* end = array + 100;
for (i = array; i < end; i++) { /* do whatever */ }
如果您使用不同大小的数据类型,则不必重写循环。
答案 3 :(得分:1)
使用指针进行此测试的正确方法如下:
int i;
int *i_ptr = &i;
for (*i_ptr = 0; *i_ptr < 99999; *i_ptr++) {
...
答案 4 :(得分:1)
原因是因为指针的增量操作不同。
在整理中,i++
将i
增加1。
对于指针,i++
按指向对象的大小递增,取决于您的体系结构,它将为4或8。
因此当i
是一个指针而i
是一个int时,你的循环只运行迭代次数的1/4或1/8。