通过添加自动变量来缩短执行时间

时间:2018-12-17 22:16:12

标签: c performance

我自己在玩C语言,并且试图编写最快的算法来找到amicable numbers

这是我写的(我刚刚开始,所以请不要向我建议改进算法的方法,因为我想自己编写):

#include <stdio.h>
#include <time.h>

#define MAX (200000)

int dividersSum(int);
void amicable();

int main() {
    clock_t start = clock();
    amicable();
    double executionTime = ((double)clock() - start) / CLOCKS_PER_SEC;
    printf("\nEXECUTION TIME: %lf", executionTime);
    return 0;
}

int dividersSum(int n) {
    int i, sum;
    for (sum = 1, i = 2; i <= n / 2; i++) {
        if (!(n % i)) {
            sum += n / i;
        }
    }
    return sum;
}

void amicable() {
    int a, divSum, tot = 0;

    for (a = 1; a < MAX; a++) {
        divSum = dividersSum(a);
        if (divSum > a && dividersSum(divSum) == a) {
            printf("\n\t%d\t\t%d", a, dividersSum(a));
            tot++;
        }
    }

    printf("\n\nTOT: %d", tot);
}

现在,这很好。或者,至少可能不是那么好,因为它只花了40秒钟就完成了,但是它可以工作。

但是,如果我更改此行:

int i, sum;

对此:

int i, sum, a = 4, b = 4, c = 4, d = 4, e = 4, f = 4;

“显着”改善。这需要36秒才能完成。

我从控制台计时器获得这些执行时间。我知道它根本不准确(实际上是,一旦我有机会再次使用此算法,我将尝试使用time.h库),但是我尝试了2个版本的代码超过50次,对于“正常”版本,我总是得到40秒或更多的时间,而对于另一版本,我总是得到36秒或更少的时间。

我还尝试过更改运行程序的计算机,但是执行修改后的版本通常要少10%。

当然这对我来说毫无意义(我对编程很陌生,我已经用Google对其进行了搜索,但是即使我真的不知道要寻找什么也没有用……),我唯一能做的考虑一下是编译器的优化(我使用讨厌的Dev c ++),但是哪个优化呢?如果是这样的话,为什么它不使用“普通”代码也使用相同的优化,因为它使速度更快?


哦,如果您想知道为什么我尝试声明随机变量,原因是我想测试使用更多变量是否有可衡量的恶化情况。我现在知道这是一种非常愚蠢的测试方式,但是正如我在帖子开头所说的那样,我在“玩” ...

1 个答案:

答案 0 :(得分:0)

好吧,我问我的大学老师。他在自己的计算机上运行了两个版本,一开始他就感到非常惊讶(“正常”版本43秒,更快36个)。

然后他告诉我他不知道为什么会这样,但是他推测是由于编译器组织代码的方式而发生的。这些额外的变量可能会迫使编译器将代码存储在内存的不同页面中,这就是这种情况的原因。 当然他不确定他的答案,但是对我来说似乎很公平。

这样的事情有时会发生是很有趣的。


此外,如Brendan在评论部分所述:

  

如果编译器没有忽略(或警告)未使用的变量(即使是相对琐碎的优化),则编译器便便(通常是不好的,或者受命令行选项的破坏),并且您的答案问题应该是“编译器便便”(例如,未能将第二个版本优化为与第一个版本完全相同的输出代码)。


当然,如果有人认为有更好的解释,我很乐意听他的话!