与windows平台相比,CPU在Linux中执行嵌套for循环花费的时间太多
我将在我的Linux平台上运行一个嵌套for循环,大约需要55毫秒,同样的程序可以在windows上运行,大约需要25毫秒 Linux和Windows平台中的CPU配置与CPU时钟和RAM相比几乎相同 我还附上了这个问题的代码 那么,有没有人知道这里发生了什么,或者如何优化我将在Linux PC上运行的嵌套for循环与windows平台相比,CPU在Linux中执行嵌套for循环花费的时间太多,c,linux,windows,C,Linux,Windows,我将在我的Linux平台上运行一个嵌套for循环,大约需要55毫秒,同样的程序可以在windows上运行,大约需要25毫秒 Linux和Windows平台中的CPU配置与CPU时钟和RAM相比几乎相同 我还附上了这个问题的代码 那么,有没有人知道这里发生了什么,或者如何优化我将在Linux PC上运行的嵌套for循环 for (i = 0; i < 1944; i += 2) for (j = 0; j < 2592; j += 2) {
for (i = 0; i < 1944; i += 2)
for (j = 0; j < 2592; j += 2)
{
Here some arithmetic operation is going on
}
(i=0;i<1944;i+=2)的
对于(j=0;j<2592;j+=2)
{
这里正在进行一些算术运算
}
在这种情况下,Linux与Windows几乎毫无关系。是吗
- 在两个平台上使用相同的编译器
- 在两个平台上使用相同版本的编译器
- 在两个平台上使用相同的优化设置
- 您是否对两个基准测试使用相同的硬件
- 您是否在后台运行其他进程
- 在这两种情况下,您是否使用相同的技术来衡量性能
- 你收集了足够的样本(你做了数学证明了吗)
- 首先将循环隔离到单个C文件中。这意味着:将循环移动到函数“test_loop()”中,并将此函数移动到单独的C文件中
- 尤其是在生成64位可执行文件时,函数不应有任何参数,但所有数据输入和输出都应通过全局变量完成
- 获取用于Windows的GCC,并使用“-s”选项(GCC-o loop.s-s loop.c)编译该文件。结果将是一个汇编文件
- 如果要检查64位Linux,请确保在Windows上编译64位;如果要检查32位Linux,请确保在Windows上编译32位
- 使用GCC for Windows(GCC-o test.exe test.c loop.s)编译整个程序,并进行运行时测量
- 注意:在Windows 32位下,C编译器会在所有函数名中添加下划线。因此,在Linux下使用汇编文件时,该函数将命名为“\u test\u loop()”。全局变量名(由汇编程序文件使用)也是如此。您必须调整剩余的C文件,以便在Linux下进行编译。编译64位时,情况并非如此
- 在Linux下编译程序。不要再次编译包含循环的C文件,而是使用Windows下生成的汇编程序文件。将Linux上的运行时与Windows上的运行时进行比较
- 使用同一台计算机进行运行时测量;不是两台“硬件相似”的计算机
如果Windows下的运行时间更快,则问题可能是时间测量的准确性问题。小于100ms的时间测量通常非常缓慢。要检查这一点,您应该创建一个从0到999的外部循环,以便现在嵌套三个循环。现在的时间应该是55秒,而不是25秒。1。我们需要“一些算术运算”。2.我们需要您正在使用的编译器名称以及用于调用它们的参数。3.我们需要您用来分析代码的代码,以验证其准确性。除非您提供用于进行性能测试的数学和/或脚本,否则有人能帮您什么忙?“Linux”和“Windows”不是我听说过的C编译器的名称。“Linux和Windows平台上的CPU配置几乎相同”--几乎相同?意味着在基于Linux和Windows的PC上,CPU时钟和RAM等硬件配置相同。“几乎”并不意味着“相同”。但是不管怎样,请阅读下面的评论和答案,并考虑为什么你的问题已经被否决了。考虑一下:他是否以可比的方式来衡量绩效?测量误差是多少?进行了多少次测量,您是否进行过统计比较,如student-t测试或卡方测试?windows中的编译器是vc++编译器,而linux中的编译器是gcc编译器。是。我在这两个平台上使用相同的硬件,我还根据该代码编译了一个示例二进制文件,在linux上需要55毫秒,在windows平台上需要25毫秒。我没有在后台运行任何其他进程。我在Linux中从我方获得了上述问题的解决方案。感谢您对讨论该问题的支持。通过在gcc编译器中设置优化标志,现在我可以获得mor