问题的解决方案在问题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
(即禁用例外)。
我们从这些数据中看到了什么:
差异不是由于流程启动时间,因为运行时间与输入成正比
运行Wine和Windows之间的区别只存在于gcc编译的程序,而不是msvc编译的程序:它不能被其他程序在Windows上占用CPU或者timethis.exe被破坏
答案 0 :(得分:4)
您会对涉及哪些系统库感到惊讶。只需在您的应用上执行ldd,看看哪些是使用的(好吧,不是那么多,但肯定是glibc)。
为了完全信任您关于执行速度的发现,您需要按顺序运行您的应用程序几次并占用平均执行时间。可能是OS加载器速度较慢(尽管4s是一个很长的加载时间)。
其他可能的原因是:
其中大多数都很容易基准; - )
您的更新更新:您现在唯一能做的就是个人资料。停止猜测,让分析器告诉你时间花在哪里。使用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。