C 通过添加自动变量改善执行时间

C 通过添加自动变量改善执行时间,c,performance,C,Performance,我自己在玩C语言,我试图编写最快的算法来寻找答案 这是我写的(我刚刚开始,所以请不要建议我改进算法的方法,因为我想自己写): 为此: int i, sum, a = 4, b = 4, c = 4, d = 4, e = 4, f = 4; 它“大幅度”改善了。完成这项工作需要36秒 我从控制台计时器获取这些执行时间。我知道它一点也不准确(事实上,只要我有机会再次研究这个算法,我就会尝试使用time.hlibrary),但我尝试了这两个版本的代码50多次,对于“正常”版本,我总是得到40秒或更

我自己在玩C语言,我试图编写最快的算法来寻找答案

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

为此:

int i, sum, a = 4, b = 4, c = 4, d = 4, e = 4, f = 4;
它“大幅度”改善了。完成这项工作需要36秒

我从控制台计时器获取这些执行时间。我知道它一点也不准确(事实上,只要我有机会再次研究这个算法,我就会尝试使用
time.h
library),但我尝试了这两个版本的代码50多次,对于“正常”版本,我总是得到40秒或更长的时间,而对于另一个版本,我总是得到36秒或更短的时间

我还尝试更改运行程序的机器,但执行修改后的版本所需的时间通常会减少10%

当然,这对我来说毫无意义(我对编程非常陌生,我在谷歌上搜索过它,但什么都没有,因为我真的不知道要找什么…),我唯一能想到的是编译器的优化(我使用讨厌的Dev c++),但哪种优化?如果是这样的话,为什么它不在“普通”代码中使用相同的优化,因为它使它更快



哦,如果你想知道我为什么要声明随机变量,原因是我想测试在使用更多变量时是否有可测量的恶化。我现在知道这是一种非常愚蠢的测试方法,但正如我在文章开头所说的,我当时正在“玩”…

嗯,我问了我大学的老师。他在他的机器上运行了这两个版本,一开始他相当惊讶(43秒是“正常”版本,36秒更快)

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

这类事情有时会发生,这很有趣


此外,如评论部分所述:


如果编译器没有忽略(或警告)未使用的变量(即使这是一个相对琐碎的优化),那么编译器就是poo(一般来说是不好的,或者被命令行选项破坏),您的问题的答案应该是“编译器是poo”(例如,未能将第二个版本优化为与第一个版本完全相同的输出代码)



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

你看,有类似的网站可以让你比较这些程序的汇编输出。当使用gcc编译器时,汇编输出中的程序之间没有区别。因此,在发布生成的程序汇编后,我们可以比较现在,你在比较你的编译器,而不是程序。你在使用什么编译器和编译器选项?你能发布这两个程序的汇编吗?@KamilCuk谢谢你的回答!我可以,我会尽快再做一次,但我不明白如何获得汇编。我的意思是,如果我只需要复制我发布的代码你建议的站点,我认为这是你已经做的。顺便说一下,我使用DEV C++,我没有改变任何选项。作为一个经验法则,95%的所有执行时间问题都是由不正确的基准测试引起的。因此,我们也可以很安全地打赌,这里也是如此。不提优化设置。您是否使用版本配置来编译程序,这就是您看到时间差异的地方?我认为有些编译器会完全忽略未使用的变量(还有输出警告),至少在发布版本中。如果未使用的变量占用空间,这可能会影响对齐,但在发布版本中,应将寄存器用于
i,n,sum
。如果编译器没有忽略(或警告)未使用的变量(即使这是一个相对简单的优化),则编译器是poo(一般来说是不好的,或者被命令行选项破坏了),您的问题的答案应该是“编译器是poo”(例如,未能将第二个版本优化为与第一个版本完全相同的输出代码).如果Brendan发布了这个答案,我会对它进行投票。你使用的编译器、平台和设置是什么?我无法用clang在OS/X上重现你的观察结果。
int i, sum;
int i, sum, a = 4, b = 4, c = 4, d = 4, e = 4, f = 4;