2011-11-09 20 views
4

これに対する解決策は、Executable runs faster on Wine than Windows -- why?の質問に見つかりました。Glibcのfloor()はおそらくシステムライブラリの観点から実装されています。WindowsよりLinuxで同じプログラムの方が高速です - なぜですか?


私は物理シミュレーションのために非常に小さなC++プログラム(〜100行)を持っています。私は同じコンピュータ上のUbuntu OneiricとWindows XPの両方でgcc 4.6.1でコンパイルしました。私は正確に同じコマンドラインオプション(同じメイクファイル)を使用しました。

奇妙なことに、Ubuntuでは、プログラムは(Windowsの場合よりも7.5秒~13.5秒)速く終了します。この時点では、コンパイラの違いだと思っていました(同じバージョンを使用していても)。

さらに奇妙なことに、ワインの下で実行可能なWindowsを実行すると、Windowsよりも高速です(実際には11秒、「ユーザー」は7.7秒です)。

私は混乱しています。確かに同じコードが同じCPU上で実行されている場合、タイミングに違いはありません。

これはどのような理由が考えられますか?どうしたらいいですか?

プログラムは最小限のI/O(1行出力)を行い、固定長のvector(STLからのみ)を使用します(つまり、システムライブラリは関係ありません)。 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(例外が無効)でした。

  1. 実行時間が入力

  2. に比例するよう差は、起動時間を処理することによるものではない。我々は、このデータから見る何

    Timings

    WineとWindowsでの実行の違いは、gccコンパイルされたプログラムの場合のみであり、msvcでコンパイルされたプログラムの場合には存在しません.Windows上のCPUまたはhtogの他のプログラムでは、 ethis.exeが壊れています。

+0

このことは、どのくらいのメモリを使用しているの?プロファイラの下で実行しようとしましたか? – bdonlan

+0

2台の異なる車(トラックと小型スポーツカー)が同じエンジンを使用している場合、同じ速度で加速すべきですか? – CrazyDart

+0

Windowsで起動時間が長いことはありますか?プログラムの実行時間を長くすると、WindowsとLinuxの時間差はどのように影響しますか? – celtschk

答えて

4

システムライブラリがどのようなものであるかは驚きです。あなたのアプリでlddを実行し、どちらが使用されているかを確認してください(大丈夫ですが、確かにglibcです)。

実行速度についての調査結果を完全に信頼するには、アプリを数回連続して実行して平均実行時間を取る必要があります。 OSローダーがちょうど遅いかもしれません(4秒は長いローディング時間です)。

他の非常に考えられる理由は以下のとおりです。

  1. 別のmallocの実装
  2. 例外処理、極端に使用した場合の減速(WindowsのGCC、MinGWのは、ショーの最適な例外処理のスターではないかもしれない可能性があります)
  3. OSに依存した初期化:Linux上ではなくWindows上でのプログラムの起動時に行う必要があるもの。

は、これらのほとんどは、あなたの更新の更新;-)


簡単benchmarkableです:あなたが今できる唯一のことは、プロファイルです。推測を停止し、プロファイラに時間がどこに費やされているかを伝えさせてください。 gprofとVisual Studioの組み込みプロファイラを使用し、さまざまな機能で費やされた時間を比較します。

+0

タイミングが正しいことを確かめるために何度も走った(私は物理学を学んだので、ラボの授業中にレッスンを学んだ)。まず最初にシングルランタイムを1分以上に増やし、例外を無効にします(私はそれらを使用していません)、 'std :: vector'の代わりにCスタイルの配列を使用してすべてのmalloc/newを取り除くと、もう一度やり直します。再起動する必要があるので、しばらく時間がかかります。 – Szabolcs

+0

質問に私の編集を見てください。私はポイント2と3を除外しました。ポイント1はまだ可能ですが、理解しているところでは、起動時に 'std :: vector'が初期化されるときを除いて、プログラムはヒープにメモリを割り当ててはなりません。 – Szabolcs

+0

Szabolcs:あなたのアップデート、私の更新プログラムの1つの単語を見てください:profile! – rubenvb

1

明らかに違いはシステムに関連しています。

あなたは、コールが行われているもののシステムを理解することstraceを使っ例えば

strace -o /tmp/yourprog.tr yourprog 

、その後/tmp/yourprog.tr

に見えるかもしれません(straceの同等は、Windowsに存在していた場合は、それを使用してみてください)

あなたのプログラムはメモリを割り当てているかもしれません(mmapシステムコールを使用しています)、おそらくメモリ関連のシステムコールはLinuxではWindowsより速いですか?あるいは、他のいくつかのシステムコールは、Linux上でWindows上のより高速な機能を提供します。

NB。私はWindowsについては何も知らない。なぜなら私は1986年以来Unixシステムを使用しており、1993年以来Linuxを使用しているからだ。

+0

私はそれを試みます。タイトルの編集に関しては、WindowsやWineで実行される同じ実行可能ファイルにも違いがあります(ソースが異なるシステムでコンパイルされたときだけでなく)。どちらが本当に私にとって奇妙です。 – Szabolcs

+0

Wineを使用すると、間接的にLinuxカーネルを使用しています。だから、それほど奇妙ではありません(WineとLinuxの両方で、同じカーネルを使用しています)。 –

2

コードでベンチマークを行う。また、Visual Studioでコンパイルしてみてください。あなたがYahooメッセンジャーのようないくつかのアプリケーションを持っているなら、それはフックをインストールしているので、アプリケーションの読み込み時間を非常に簡単にすることができます。 Windows上で

あなたが持っている:LinuxのQueryPerformanceCounterの :にclock_gettime

関連する問題