此問題的解決方案在問題Executable runs faster on Wine than Windows -- why?中發現Glibc的floor()
可能是以系統庫的形式實現的。Linux上的相同程序比Windows更快 - 爲什麼?
我有一個非常小的C++程序(〜100行)進行物理模擬。我在同一臺計算機上用Ubuntu Oneiric和Windows XP上的gcc 4.6.1編譯了它。我使用完全相同的命令行選項(相同的生成文件)。
奇怪的是,在Ubuntu上,該程序比Windows上的版本更快(大約7.5 s比13.5 s)更快速地完成。在這一點上,我認爲這是一個編譯器的差異(儘管使用相同的版本)。但更奇怪的是,如果我在wine下運行Windows可執行文件,它的速度仍然快於Windows(我獲得11秒「真實」和7.7秒「用戶」時間 - 並且這包括wine啓動。)
我很困惑。當然,如果相同的代碼在同一個CPU上運行,那麼時間不應該有差異。
這可能是什麼原因?我能做什麼錯?該程序做最小I/O(輸出單行),並且僅使用來自STL的固定長度vector
(即,不應涉及系統庫)。在Ubuntu上,我使用默認的gcc和Windows上的Nuwen distribution。我確認在進行基準測試時CPU使用率接近於零(我關閉了大部分程序)。在Linux上,我使用time
進行計時。在Windows上,我使用了timethis.exe
。
UPDATE
我做了一些更精確的計時,比較適用於Windows XP,葡萄酒gcc和MSVC編譯程序的不同輸入(運行時間必須是正比於輸入)的運行時間和Linux操作系統。所有數字都以秒爲單位,並且是至少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或tim ethis.exe被破壞。
這件事是使用多少內存?你有沒有嘗試在探查器下運行它? – bdonlan
這就像是說2個不同的汽車(一輛卡車和一輛小型跑車)是否使用相同的發動機,他們應該以相同的速度加速? – CrazyDart
難道是在Windows上啓動時間較大?如果您讓程序運行時間更長,那麼這會如何影響Windows和Linux之間的時間差? – celtschk