【发布时间】:2011-12-25 16:34:08
【问题描述】:
解决方案在问题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 秒对 13.5 秒)。此时我认为这是编译器的差异(尽管使用相同的版本)。
但更奇怪的是,如果我在 wine 下运行 Windows 可执行文件,它仍然比在 Windows 上快(我得到 11 秒的“真实”时间和 7.7 秒的“用户”时间——这包括 wine 启动。)
我很困惑。当然,如果相同的代码在同一个 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(即异常被禁用)。
我们从这些数据中看到的:
差异不是由于进程启动时间,因为运行时间与输入成正比
在 Wine 和 Windows 上运行的区别只存在于 gcc 编译的程序,而不是 msvc 编译的程序:不能由其他程序在 Windows 上占用 CPU 或 timethis.exe 被破坏.
【问题讨论】:
-
这个东西占用了多少内存?您是否尝试过在分析器下运行它?
-
这就像说如果 2 辆不同的汽车(一辆卡车和一辆小型跑车)使用相同的引擎,它们应该以相同的速度加速?
-
会不会是Windows上的启动时间比较长?如果让程序运行时间更长,对 Windows 和 Linux 的时差有何影响?
-
@bdonlan 根据 Process Explorer,它使用的内存不到 1 MB。
-
@celtschk 我会检查的。我无法快速回复,因为我需要重新启动才能在 Linux 上进行测试。
标签: c++ windows linux gcc benchmarking