2011-11-09 89 views
4

此問題的解決方案在問題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(即禁用了例外)。

Timings

我們從這個數據看什麼:

  1. 的差異不是由於工藝的啓動時間,因爲運行時間正比於輸入

  2. 的在Wine和Windows上運行的區別僅在於gcc編譯的程序,而不是msvc編譯的程序:它不能由其他程序在Windows上佔用CPU或tim ethis.exe被破壞。

+0

這件事是使用多少內存?你有沒有嘗試在探查器下運行它? – bdonlan

+0

這就像是說2個不同的汽車(一輛卡車和一輛小型跑車)是否使用相同的發動機,他們應該以相同的速度加速? – CrazyDart

+0

難道是在Windows上啓動時間較大?如果您讓程序運行時間更長,那麼這會如何影響Windows和Linux之間的時間差? – celtschk

回答

4

你會驚訝什麼系統庫參與。只需在您的應用上執行ldd,然後查看哪些是使用的(好吧,不是那麼多,但肯定是glibc)。

爲了完全信任您的結果執行速度,您需要按順序運行您的應用程序幾次,並採取平均執行時間。這可能是OS加載器速度較慢(雖然4s是一個很長的加載時間)。

其他很可能的原因是:

  1. 不同的malloc實現
  2. 異常處理,如果使用到了極致可能會導致增長放緩(視窗GCC,MinGW的,可能不是演出的最佳異常處理明星)
  3. 依賴於操作系統的初始化:需要在Windows上啓動程序時執行的操作,而不是在Linux上執行。

大部分是容易benchmarkable ;-)


更新了自己的更新:你現在可以做的唯一事情是配置文件。不要猜測,讓一個分析器告訴你在哪裏花費時間。使用gprof和Visual Studio內置分析器並比較在不同功能中花費的時間。

+0

我跑了很多次,以確保時間是正確的(我學習物理,所以我在實驗課上學到了課程)。好,首先我將單次運行時間增加到一分鐘以上,我將禁用異常(我沒有使用它們),將使用C風格的數組代替'std :: vector'來獲取擺脫所有malloc/new,然後我會再試一次。這需要一段時間,因爲我需要重新啓動。 – Szabolcs

+0

請參閱我的編輯問題。我排除了第2點和第3點。第1點仍然是可能性,但從我的理解,我的程序不應該在堆上分配內存,除非在啓動時初始化std :: vector'。 – Szabolcs

+0

Szabolcs:看到我的更新更新,一個字:配置文件! – rubenvb

1

顯然不同的是系統相關。

您可以使用strace瞭解完成哪些系統調用,如

strace -o /tmp/yourprog.tr yourprog 

,然後看看/tmp/yourprog.tr

(如果strace等效在Windows上存在,嘗試使用它)

也許你的程序正在分配內存(使用mmap系統調用),並且在Linux上(甚至在Wine上)與內存相關的系統調用在Windows上比在Windows上更快?或者其他一些系統調用在Windows上的Linux上提供更快的功能。

注意:我對Windows一無所知,因爲我從1986年開始使用Unix系統,從1993年開始使用Linux。

+0

我會試試。關於您對標題的編輯,同樣的可執行文件也有所不同,可以在Windows或Wine上運行(而不僅僅是在不同系統上編譯源代碼時)。這對我來說真的很奇怪。 – Szabolcs

+0

當您使用Wine時,您將間接使用Linux內核。所以它不是很奇怪(在Wine和Linux下,你都使用相同的內核)。 –

2

在代碼中進行基準測試。也嘗試用visual studio進行編譯。在Windows上,如果你有像雅虎通這樣的應用程序,安裝鉤子,他們可以很容易地減緩你的應用程序加載時間。

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

相關問題