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

时间:2011-11-09 21:20:03

标签: c++ windows linux gcc benchmarking

问题的解决方案在问题Executable runs faster on Wine than Windows -- why?中找到.Glibc的floor()可能是根据系统库实现的。


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

奇怪的是,在Ubuntu上,程序完成很多比在Windows上快(~7.5秒vs 13.5秒)。在这一点上,我认为这是编译器的差异(尽管使用相同的版本)。

但更奇怪的是,如果我在葡萄酒下运行Windows可执行文件,它仍然比在Windows上更快(我得到11秒“真实”和7.7秒“用户”时间 - 这包括葡萄酒启动。)

我很困惑。当然,如果在同一个CPU上运行相同的代码,则时间应该没有差异。

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

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

更新

我做了一些更精确的计时,比较了Windows XP,Wine和Linux上gcc和msvc编译程序的不同输入(运行时必须与输入成比例)的运行时间。所有数字均以秒为单位,至少为3次运行。

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

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

Timings

我们从这些数据中看到了什么:

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

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

3 个答案:

答案 0 :(得分:4)

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

为了完全信任您关于执行速度的发现,您需要按顺序运行您的应用程序几次并占用平均执行时间。可能是OS加载器速度较慢(尽管4s是一个很长的加载时间)。

其他可能的原因是:

  1. 不同的malloc实现
  2. 异常处理,如果用于极端可能导致速度减慢(Windows GCC,MinGW,可能不是节目的最佳异常处理明星)
  3. 依赖于操作系统的初始化:需要在Windows上的程序启动时完成的操作,而不是在Linux上。
  4. 其中大多数都很容易基准; - )


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

答案 1 :(得分:2)

在代码中进行基准测试。还尝试使用visual studio进行编译。在Windows上如果你有像Yahoo Messenger这样的应用程序,那就是安装钩子,它们可以很容易地减慢你的应用程序加载时间。

在Windows上你有:QueryPerformanceCounter 在Linux上:clock_gettime

答案 2 :(得分:1)

显然,差异与系统有关。

您可以使用strace来了解已完成的系统调用,例如

strace -o /tmp/yourprog.tr yourprog

然后查看/tmp/yourprog.tr

(如果在Windows上存在等效的strace,请尝试使用它)

也许你的程序正在分配内存(使用mmap系统调用),并且在Linux上(甚至在Wine上)内存相关的系统调用可能比在Windows上更快?或者其他一些系统调用可以在Windows上为Linux提供更快的功能。

NB。我对Windows一无所知,因为我从1986年开始使用Unix系统,自1993年开始使用Linux。