2012-01-26 8 views
5

LinuxからWindowsにC++コードを移植しています。このプロセスの間に、私は次の行が(まったく同じハードウェア上)は、Windowsの下で〜10倍遅くを取ることが判明:Linux上でそれは〜1msのをとりながら、WindowsではWindowsとLinuxのメモリ割り当て/ std :: listコンストラクタのパフォーマンス

list<char*>* item = new list<char*>[160000]; 

それは、〜10msのを取ります。これは平均時間であることに注意してください。この行を100回実行すると、Windowsでは約1秒かかります。

これは、両方のバージョンがリリースでコンパイルされ、速度がQueryPerformanceCounter(Windows)およびgettimeofday(Linux)によって測定されます。

Linuxコンパイラはgccです。 WindowsコンパイラはVS2010です。

なぜこれが起こる可能性がありますか?

+3

とにかくループが起ころうとしていますそれは10msが他のものが進行することによって容易に妨げられるほどです。少なくとも数秒で測定してください。しかし、それでも私はウィンドウ上のメモリを割り当てるための方法が遅いと推測します。ちょっと遊んで、あなたのプログラムで使うパターンのようにしてください。 – PlasmaHH

+10

@EdHeal:タイムマシンを修正しました。あなたは今1998年に戻って幸せにそこに住むことができます。 –

+0

@ssgわからない私の側では、Qtで5msの解像度のタイマーを持っていて、Windowsでそれをする方法がないように最善を尽くしました。 – UmNyobe

答えて

10

これは、ライブラリの実装の問題かもしれません。ほとんどの場合 の単一割り当てがあり、デフォルトのコンストラクタlist は割り当てられません。だから、あなたが測定しようとしているのは、listのデフォルトのコンストラクタのコスト (これは160000で実行されます)です。

私は「測定しようとしています」と言いますが、測定値が の実行時間よりも短い測定値は です。 を実行するには、これをループに入れて実行時間を数秒で取得する必要があります。 これを行うときは、コンパイラ が何も最適化していないことを確認するための注意をする必要があります。

Linuxでは、少なくともclock()を使用して測定する必要があります。壁 あなたがgettimeofdayから得る時計の時間は、他に何かに非常に依存しています 同時に起こる。 (Windowsではclock()を使用しないでください。 )Windowsの実装は壊れています。

+1

私はこれが、 'std :: list'のコンストラクタのコストを測定しており、メモリの割り当てではないことに同意しています。さらに、* placement-'new []' *の後にアロケーションを使用して2つを別々に測定することは自明です。 –

+0

真であることが判明したので、リスト<> ctorはほとんどの時間に行きました。 –

2

私は、この命令は両方のOSで(何に関係なく)時間がかかりません。この場合、タイマーの解像度を実際に測定しているような時間がかかります。

関連する問題