我自己在玩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 ++),但是哪个优化呢?如果是这样的话,为什么它不使用“普通”代码也使用相同的优化,因为它使速度更快?
哦,如果您想知道为什么我尝试声明随机变量,原因是我想测试使用更多变量是否有可衡量的恶化情况。我现在知道这是一种非常愚蠢的测试方式,但是正如我在帖子开头所说的那样,我在“玩” ...
答案 0 :(得分:0)
好吧,我问我的大学老师。他在自己的计算机上运行了两个版本,一开始他就感到非常惊讶(“正常”版本43秒,更快36个)。
然后他告诉我他不知道为什么会这样,但是他推测是由于编译器组织代码的方式而发生的。这些额外的变量可能会迫使编译器将代码存储在内存的不同页面中,这就是这种情况的原因。 当然他不确定他的答案,但是对我来说似乎很公平。
这样的事情有时会发生是很有趣的。
此外,如Brendan在评论部分所述:
如果编译器没有忽略(或警告)未使用的变量(即使是相对琐碎的优化),则编译器便便(通常是不好的,或者受命令行选项的破坏),并且您的答案问题应该是“编译器便便”(例如,未能将第二个版本优化为与第一个版本完全相同的输出代码)。
当然,如果有人认为有更好的解释,我很乐意听他的话!