この質問はすでにここに投稿していますが、Qt固有ではないかもしれないので、ここでもチャンスを試してみようと思いました。私はそれをするのが不適切ではないことを願っています(そうであるかどうか教えてください)。
私はいくつかの数学的計算を実行する小さな科学プログラムを開発しました。できるだけ速くなるように最適化しようとしました。これで、Windows、Mac、およびLinuxユーザーへの展開はほぼ完了しました。しかし、私はまだ多くの異なるコンピューターでそれをテストすることができませんでした。
困ったことは次のとおりです。Windowsに展開するために、Windows7とUbuntu12.04の両方がインストールされているラップトップを使用しました(デュアルブート)。これら2つのシステムで実行されているアプリの速度を比較したところ、Windowsでは少なくとも2倍遅いことにショックを受けました。小さな違いがあったとしても驚かなかったでしょうが、どうすればそのような違いを説明できるでしょうか。
ここにいくつかの精度があります:
- 私がプログラムに行う計算は、残忍で愚かな数学的計算にすぎません。基本的には、10億回と呼ばれるループで製品と余弦定理を計算します。一方、計算はマルチスレッドです。6つのQThreadsのようなものを起動します。
- ラップトップには、1.73Ghzの2つのコアがあります。最初は、Windowsはおそらくコアの1つを使用していないと思いましたが、小さな図によると、プロセッサのアクティビティを調べたところ、両方のコアが100%実行されています。
- 次に、Windows用のC ++コンパイラは、Linux用のC ++コンパイラが(リリースビルドで)自動的に使用した最適化オプション(-O1 -O2など)を使用していないと思いましたが、明らかに使用しています。
Windowsではアプリの速度が非常に遅い(2〜4倍)のが気になりますが、それは本当に奇妙です。一方、私はまだWindowsを搭載した他のコンピューターで試していません。それでも、なぜ違いがあるのか分かりますか?
追加情報:いくつかのデータ…</ p>
Windowsは2つのコアを使用しているように見えますが、これはスレッド管理と関係があるのではないかと思います。理由は次のとおりです。
サンプル計算n°1(これは2つのQThreadsを起動します):
- PC1-ウィンドウ:7.33秒
- PC1-linux:3.72秒
- PC2-linux:1.36s
サンプル計算n°2(これは3つのQThreadsを起動します):
- PC1-ウィンドウ:6.84秒
- PC1-linux:3.24s
- PC2-linux:1.06s
サンプル計算n°3(これは6つのQThreadsを起動します):
- PC1-ウィンドウ:8.35秒
- PC1-linux:2.62s
- PC2-linux:0.47秒
どこ:
- PC1-windows = Windows 7を搭載した2コアラップトップ(@ 1.73Ghz)
- PC1-linux = Ubuntu 12.04を搭載した2コアラップトップ(@ 1.73Ghz)
- PC2-linux = Ubuntu 12.04を搭載した8コアのラップトップ(@ 2.20Ghz)
(もちろん、PC2の方が高速であることはショックではありません。私にとって信じられないのは、PC1-windowsとPC1-linuxの違いです)。
注:Mac OSで最近のPC(4または8コア@〜3Ghz、正確には覚えていません)でプログラムを実行しようとしましたが、速度はPC2-linuxと同等(またはわずかに高速)でした。
編集:コメントで尋ねられたいくつかの質問にここで答えます。
Qt SDKをWindowsにインストールしたばかりなので、すべての最新バージョン(MinGWを含む?)があると思います。コンパイラはMinGWです。Qtバージョンは4.8.1です。
最適化フラグは、リリースモード(Qt Creatorを使用)でビルドすると自動的に使用されることに気付いたため、使用していません。QMAKE_CXXFLAGS + = -O1のようなものを書いた場合、これはデバッグビルドにのみ影響するように思われます。
スレッドなどの寿命:これは非常に簡単です。ユーザーが「計算」ボタンをクリックすると、2〜6個のスレッドが同時に起動され(計算対象によって異なります)、計算が終了すると終了します。派手すぎるものはありません。すべてのスレッドは残忍な計算を実行します(実際には、30ミリ秒ごとに(それほどではない)小さな計算を行い、基本的にエラーが十分に小さいかどうかをチェックする1つを除きます)。
編集:最新の開発と部分的な回答
これについての答えを提供するいくつかの新しい開発があります:
速度の違いが本当にスレッドと関係があるのかどうかを判断したかったのです。そこで、計算で1つのスレッドのみを使用するようにプログラムを変更しました。これにより、「純粋なC++コード」のパフォーマンスをほぼ比較できます。現在、WindowsはLinuxよりもわずかに遅いだけであることが判明しました(15%程度)。したがって、違いのごく一部(重要ではない)はシステムに固有のものであると思いますが、大部分はスレッド管理によるものです。
コメントで誰か(Luca Carlon、ありがとう)が提案したように、私はMinGWの代わりにMicrosoft Visual Studio(MSVC)用のコンパイラを使用してアプリケーションを構築しようとしました。そして驚いたことに、(すべてのスレッドとすべてを含む)計算はLinuxよりも「わずか」20%から50%遅くなりました!私は先に進んでそれに満足するつもりだと思います。奇妙なことに、「純粋なC ++」の計算(スレッドが1つしかない)が(MinGWよりも)さらに遅くなったことに気づきました。これは全体的な違いを説明する必要があります。私の知る限り、MinGWは、moronのようにスレッドを処理することを除けば、MSVCよりもわずかに優れています。
したがって、MinGW(理想的にはMSVCよりも使用したい)にスレッドをより適切に処理させるためにできることがあるか、それともできないかを考えています。私は驚かれることでしょう、どうしてそれがよく知られ、文書化されなかったのでしょうか?結論を出すのが早すぎることに注意する必要があると思いますが、(今のところ)1台のコンピューターで物事を比較しただけです。