您是否在循环中执行任何函数调用(例如,在“math.h”中定义的函数)?
如果是,该问题可能是一个低效率的实现相比于Windows库的GNU库(在Linux中使用)这些功能。
您是否正在生成32位或64位可执行文件?比较一个系统上的64位可执行文件和另一个系统上的32位可执行文件是没有意义的!
如果您安装32位运行时库或静态编译,您(通常)可以在64位Linux下运行32位可执行文件。您始终可以在64位Windows下运行32位可执行文件。
如果你不使用函数调用和32/64位也不是你可以检查,如果这是通过执行下列编译器性能问题一个问题:
- 首先隔离圈成一个C文件。这意味着:将循环移动到函数“test_loop()”并将此函数移动到单独的C文件中。
- 特别是当生成64位可执行文件时,函数不应该有任何参数,但所有数据输入和输出都应该通过全局变量完成。
- 获取GCC for Windows并使用“-s”选项编译文件(gcc -o loop.s -S loop.c)。结果将是一个汇编文件。
- 确保在Windows上编译64位,如果您将检查64位Linux并在Windows上编译32位,如果您将检查32位Linux
- 使用GCC for Windows编译整个程序(gcc -o test.exe test.c loop.s)并进行运行时测量。
- 注意:在Windows 32位下,C编译器向所有函数名称添加下划线。因此,在Linux下使用汇编文件时,该函数将被命名为“_test_loop()”。全局变量名称(由汇编程序文件使用)也是如此。您必须修改其余的C文件以在Linux下进行编译。 编译64位时,情况并非如此。
- 编译Linux下的程序。不要再次编译包含循环的C文件,而是使用在Windows下生成的汇编程序文件。比较Linux上的运行时和Windows上的运行时间
- 使用同一台计算机进行运行时间测量;不是两台具有“类似硬件”的计算机
如果两个操作系统的运行时间现在都相同,那么您会发现它是一个编译器问题。如果需要Linux下的性能,可以使用Microsoft编译器在Windows下编译该文件并在Linux下使用该目标文件。不幸的是Windows使用另一种目标文件格式而不是Linux,所以目标文件必须被转换(从COFF到ELF)。
如果在Windows下运行时间仍然较快,那么问题可能是是时间测量的准确性问题。时间测量小于100ms通常非常不准确。为了检查这个,你应该创建一个从0到999的外部循环,以便现在嵌套三个循环。时间现在应该是55秒,而25秒。
1.我们需要“一些算术运算”。 2.我们需要您使用的编译器名称以及您用来调用它们的参数。 3.我们需要您使用的代码来分析您的代码,以验证其准确性。 – orlp
除非您提供用于进行性能测试的数学和/或脚本,否则任何人都可以帮助您? – Paul
“Linux”和“Windows”不是我所听过的C编译器的名称。 “Linux和Windows平台中的CPU配置几乎相同” - *几乎相同? –