私は、頂点のセットの「ソフト選択」を計算するRuby C Extensionを作成しています。 3D点間の距離が計算される、多くの繰り返しです。切り替えコンパイラ - パフォーマンスが低下しました - 理由を理解しようとしています
最初は、私が見つけたテンプレートでPelles C IDEベースのものを使用しました。
その後、Visual Studio C++ Express 2010に付属のnmake
を使用して更新を行いました。私が見つけたのは、パフォーマンスが低下したことでした。
私はPelles Cで書いた元のコードに戻し、nmake
でコンパイルして、まったく同じコードが遅いことがわかりました。
Pelles C
> Updating soft selection took 0.741 seconds (12176 of 21692 Vertices)
> Updating soft selection took 0.751 seconds (10911 of 21692 Vertices)
> Updating soft selection took 0.859 seconds (10765 of 21692 Vertices)
> Updating soft selection took 0.753 seconds (10653 of 21692 Vertices)
> Updating soft selection took 0.75 seconds (10747 of 21692 Vertices)
> Updating soft selection took 0.751 seconds (10822 of 21692 Vertices)
Visual Studioは
> Updating soft selection took 1.282 seconds (11853 of 21692 Vertices)
> Updating soft selection took 1.273 seconds (12204 of 21692 Vertices)
> Updating soft selection took 1.286 seconds (11720 of 21692 Vertices)
> Updating soft selection took 1.248 seconds (12996 of 21692 Vertices)
> Updating soft selection took 1.293 seconds (10705 of 21692 Vertices)
> Updating soft selection took 1.276 seconds (12204 of 21692 Vertices)
私はCとコンパイルすると非常に経験の浅いんだ - しかし、私は、パフォーマンスの違いは、コンパイラ間の違いによるものであることを前提としていとコンパイルの指示?
バージョンでは、extconf.rb
で作成されたMakefileを使用しました.Pelles Cバージョンでは、私が見つけたサンプルプロジェクトの設定が何であれ使用しました。
ここで重要なのはCFLAGS
だと思いますか?
CFLAGS? Pelles Cプロジェクトの
さがある:それはあるnmake
プロジェクトのために CCFLAGS = -Tx86-coff -MD -Ot -Ox -W1 -Gd -Ze -Zl#
: CFLAGS = -MD -Zi -O2b2xg- -G6
私はCFLAGS
とパフォーマンスを見上げたとき、それは通常のフラグO
、O2
とO3
に言及しました - nmake
MakefileにはO2
がありますが、奇妙な末尾の文字があります。
Pelles CプロジェクトにはOt
とOx
...がありますか?
私はこれらの意味を理解することができませんでした。この拡張は、WindowsとOSX(PPCとIntel)でコンパイルされます。パフォーマンスを最大限に引き出すには、コンパイラのどのような構成が可能ですか?少なくとも私が持っていたパフォーマンスを復元します。ここで
http://pastie.org/3543595がPelles CプロジェクトファイルのPastieです:
MakefileとPelles Cの設定ここで
はnmake
のMakefileのPastieあるhttp://pastie.org/3543597
Microsoft C++コンパイラの問題は、プログラムをマシンコードにコンパイルするのではなく、CLR(共通言語ランタイム)に変換して、 "解釈"することです。 Javaバイトコードと同様に解釈されます。これは、プログラムを実行するたびにCLRを開始するオーバーヘッドがあるため、違いを説明することができます。 (コンパイラがどのようにしてネイティブマシンコードにコンパイルするのかは分かりませんが、CとC++でコンパイルできると思います) –
おそらくPellesはあなたのコードをコンパイルするだけでしょうか? –
@Zekeそれはほとんどありません。 –