使迭代器成为指针会加速C循环吗?

时间:2010-09-05 01:25:52

标签: c pointers

我运行了以下内容:

#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秒。为什么速度变化?

5 个答案:

答案 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。