与windows平台相比,CPU在Linux中执行嵌套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) {

我将在我的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)
          {
             Here some arithmetic operation is going on
          }
(i=0;i<1944;i+=2)的

对于(j=0;j<2592;j+=2)
{
这里正在进行一些算术运算
}

在这种情况下,Linux与Windows几乎毫无关系。是吗

  • 在两个平台上使用相同的编译器
  • 在两个平台上使用相同版本的编译器
  • 在两个平台上使用相同的优化设置
所有这些都会导致结果不同。此外,甚至没有指定CPU是否相同。通过对我的音频采样率转换库进行基准测试,我发现1.7GHz Core i5和1.6GHz Atom的吞吐量相差6-7倍

  • 您是否对两个基准测试使用相同的硬件
还有许多其他因素会混淆基准

  • 您是否在后台运行其他进程
  • 在这两种情况下,您是否使用相同的技术来衡量性能
  • 你收集了足够的样本(你做了数学证明了吗)

是否在循环中进行任何函数调用(例如,对“math.h”中定义的函数进行调用)

如果是,问题可能是GNU库(Linux中使用)中这些函数的实现效率低于Windows库

您正在生成32位或64位可执行文件吗?比较一个系统上的64位可执行文件和另一个系统上的32位可执行文件毫无意义

如果安装32位运行库或静态编译,则(通常)可以在64位Linux下运行32位可执行文件。您始终可以在64位Windows下运行32位可执行文件

如果不使用函数调用,并且32/64位也不是问题,则可以通过执行以下操作检查这是否是编译器性能问题:

  • 首先将循环隔离到单个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上的运行时进行比较
  • 使用同一台计算机进行运行时测量;不是两台“硬件相似”的计算机
如果现在两个OSs的运行时相同,那么您会发现这是一个编译器问题。如果需要Linux下的性能,可以使用Microsoft编译器在Windows下编译文件,并在Linux下使用对象文件。不幸的是,Windows使用了Linux以外的另一种对象文件格式,因此必须将该对象文件转换(从COFF转换为ELF)


如果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