Linux上的程序速度比Windows快 - 为什么?

Sza*_*lcs 5 c++ linux windows benchmarking gcc

问题的解决方案是在问题上找到的,Executable在Wine上的运行速度比Windows快 - 为什么? Glibc floor()可能是根据系统库实现的.


我有一个非常小的C++程序(~100行)用于物理模拟.我在同一台计算机上的Ubuntu Oneiric和Windows XP上用gcc 4.6.1编译了它.我使用了完全相同的命令行选项(相同的makefile).

奇怪的是,在Ubuntu上,在程序完成比在Windows(〜7.5 s和13.5 S)更快.在这一点上,我认为这是编译器的差异(尽管使用相同的版本).

但更奇怪的是,如果我跑下酒Windows可执行文件,它仍然快于在Windows(我得到11的"真实"和7.7的"用户"时间 - 这包括酒启动.)

我糊涂了.当然,如果在同一个CPU上运行相同的代码,则时间应该没有差别.

这可能是什么原因? 我能做错什么?

该程序执行最小I/O(输出单行),并且仅使用vectorSTL中的固定长度(即不应涉及系统库).在Ubuntu上我使用了默认的gcc,在Windows上使用了Nuwen发行版.我确认在进行基准测试时CPU使用率接近于零(我关闭了大多数程序).在Linux上我用于time计时.在我使用的Windows上timethis.exe.

UPDATE

我做了一些更精确的计时,比较适用于Windows XP,葡萄酒和Linux的GCC和MSVC编译程序的不同输入(运行时间必须是正比于输入)的运行时间.所有数字均以秒为单位,是至少3次运行的最小值.

在Windows上我使用timethis.exe(挂机时间),在Linux和Wine上我使用了时间(CPU时间).(timethis.exe在Wine上断了)我确保没有其他程序使用CPU并禁用了病毒扫描程序.

gcc的命令行选项-march=pentium-m -Wall -O3 -fno-exceptions -fno-rtti(即禁用了例外).

计时

我们从这些数据中看到的是:

  1. 差异不是由于过程启动时间,因为运行时间与输入成比例

  2. 运行Wine和Windows之间的区别只存在于gcc编译的程序,而不是msvc编译的程序:它不能被其他程序在Windows上占用CPU或者timethis.exe被破坏.

rub*_*nvb 5

您会惊讶于所涉及的系统库。只需在您的应用程序上执行 ldd,看看使用了哪些(好吧,不是那么多,但肯定是 glibc)。

为了完全相信你对执行速度的发现,你需要按顺序运行你的应用程序几次,并取平均执行时间。可能是操作系统加载器速度较慢(尽管 4s 是很长的加载时间)。

其他非常可能的原因是:

  1. 不同的 malloc 实现
  2. 异常处理,如果使用到极致可能会导致速度变慢(Windows GCC,MinGW,可能不是节目中最佳的异常处理之星)
  3. 依赖于操作系统的初始化:需要在 Windows 上的程序启动时完成的事情,而不是在 Linux 上。

其中大多数很容易进行基准测试;-)


更新您的更新:您现在唯一能做的就是个人资料。停止猜测,让分析器告诉您时间都花在了什么地方。使用 gprof 和 Visual Studio 内置分析器并比较在不同函数中花费的时间。