2009-07-14 22 views
2

私は、WindowsとLinuxがC++プログラムでどのようにメモリ管理を行っているか、かなり興味があります。Windows、Linux、およびメモリ管理

この好奇心の理由は、LinuxとWindowsの間のC++移植で3つの非常に単純なプログラムを作成したからです。コードはまったく同じでした。ハードウェアも。しかし、結果は信じられないほど異なっていました!両方の試験を10回繰り返し、次いで算術平均を計算した。

静的な配列の配列、クラスベクトル、スタック(ポインタ付き)で順次挿入をテストしました。総挿入数は10^6であった。

のWindows XP SP2 x86の結果:整数の 静的配列:56ミリ クラスベクトル:686ミリ秒(ポインタ付き) スタック:2193ミリ秒

Slackwareの11のx86結果:整数の 静的配列:100ミリ秒 クラスベクトル:476 ms スタック(ポインタ付き):505 ms

WindowsとSlaxのスタック挿入時間の速度差は印象的です。これらの結果は正常に見えますか?どちらのコードもG ++(Windowsではmingw32-g ++)を使用してコンパイルされました。

使用したコンピュータは4GBのRAMを搭載したデュアルコア3.2Ghzで、テスト時に2GB以上の空きRAMがありました。

+0

これは問題ではありません。 (ヒント:質問は一般的に疑問符 "?"で終わります)。 – abelenky

+6

私は質問があると思います - なぜ彼らはどう違うのですか? –

+2

「これらの結果は正常に見えますか?資格を得る? – jmanning2k

答えて

6

これは...仕様を設定しますが、実装は大きく異なり++

Cをメモリ管理よりもC++ STDLIB実装(マイクロソフトMSVC対GNU libcに/ STDC++)で行うことがより多くを有することができます。

更新:そして、両方のプラットフォームでg ++を使用していることに気がつきましたが、それはまだ別の実装です。 GNUコードはUnix環境用に開発され、後でWindowsに移植されたため、Windows環境では間違った前提条件や最適化が行われる可能性があります。

元の質問は有効です。オペレーティングシステムの基本的なメモリモデルと関係しているかもしれませんが、ここでのテストは結論を導き出すにはあまりにも粗すぎます。

さらに多くのテストを実行するか、別のフラグ/コンパイラを使用しようとすると、更新された統計情報を投稿してください。

+0

ここに+1票があります。そしてFarofeiroには、gccではなくMSコンパイラを使ってWindows上でコンパイルを試みるべきです。 (ただし、ただかもしれない)それをより良くするかもしれません。 –

+0

これを試すことができます。しかし、なぜあなたはそれがより良いはずだと思いますか? Windows用のG ++はうまく最適化されていないか、VSはWindows用のコードをもっと最適化していますか? –

1

100万回の挿入で2秒が少し高すぎます。最適化を有効にしましたか?彼らがなければ、その数は何も意味しません。

編集:最適化せずにコンパイルしたので、それらを有効にして(たとえば-O2を使用)、再び測定します。違いはおそらくはるかに小さくなります。標準ライブラリはかなり守備的であり、多くの一貫性チェックを実行する傾向があり、測定値を大きく歪ませる可能性があります。

編集:最適化を有効にしても2秒以上かかる場合は、何か別のことが起こります。いくつかのコードを投稿してみてください。次のプログラムはcygwinの下で私のシステムで約40ミリ秒実行されます。

#include <stack> 

int main() 
{ 
    std::stack<int> s; 
    for (int i = 0; i < 1000000; ++i) 
     s.push(i); 
} 
+0

いいえ、私はどのような種類の最適化も有効にしていません。しかし、私がWindows版をコンパイルする方法は、私がLinux版をコンパイルしたのと全く同じでした。 –

+0

さて、私はちょうどウィンドウのバージョンを再コンパイルして、スタックは2121ミリ秒で10^6の挿入を行います。削減はありますが、それでも差は非常に大きいです。私は-O2フラグだけでコンパイルしました –

関連する問題