2012-03-07 4 views
2

私は、頂点のセットの「ソフト選択」を計算する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とパフォーマンスを見上げたとき、それは通常のフラグOO2O3に言及しました - nmake MakefileにはO2がありますが、奇妙な末尾の文字があります。

Pelles CプロジェクトにはOtOx ...がありますか?

私はこれらの意味を理解することができませんでした。この拡張は、WindowsとOSX(PPCとIntel)でコンパイルされます。パフォーマンスを最大限に引き出すには、コンパイラのどのような構成が可能ですか?少なくとも私が持っていたパフォーマンスを復元します。ここで

http://pastie.org/3543595がPelles CプロジェクトファイルのPastieです:

MakefileとPelles Cの設定ここで

nmakeのMakefileのPastieあるhttp://pastie.org/3543597

+0

Microsoft C++コンパイラの問題は、プログラムをマシンコードにコンパイルするのではなく、CLR(共通言語ランタイム)に変換して、 "解釈"することです。 Javaバイトコードと同様に解釈されます。これは、プログラムを実行するたびにCLRを開始するオーバーヘッドがあるため、違いを説明することができます。 (コンパイラがどのようにしてネイティブマシンコードにコンパイルするのかは分かりませんが、CとC++でコンパイルできると思います) –

+3

おそらくPellesはあなたのコードをコンパイルするだけでしょうか? –

+2

@Zekeそれはほとんどありません。 –

答えて

4

[OK]を、見上げられて情報。私が学んだことは、CFLAGSオプションがコンパイラに依存しているということでした。

私はMSのclコンパイラのオプションが見つかりました:http://msdn.microsoft.com/en-us/library/fwkeyyhe%28v=vs.80%29.aspx

私はPelles Cのヘルプファイルに記載オプションにそれらを比較しました。

> Updating soft selection took 0.679 seconds (12032 of 21692 Vertices) 
> Updating soft selection took 0.607 seconds (13470 of 21692 Vertices) 
> Updating soft selection took 0.717 seconds (13587 of 21692 Vertices) 
> Updating soft selection took 0.613 seconds (13218 of 21692 Vertices) 
> Updating soft selection took 0.635 seconds (9964 of 21692 Vertices) 
> Updating soft selection took 0.746 seconds (10765 of 21692 Vertices) 

出来上がり:再コンパイルした後 $CFLAGS = '-MD -Ot -Ox -W1'

性能結果:これらCFLAGSで再コンパイル

!パフォーマンスが回復しました - 少し速く見えます。 :D

未知のオプション-G6と他の廃止されたフラグに関する警告もなくなりました。

+0

私が作業していたアップデートに戻って、平均で約0.5秒でした。私が作った他の最適化のためです。最後に私が期待していたパフォーマンス:)私は幸せなパンダです。 – thomthom

+0

どのようにしてペールがメイクファイル(またはプロジェクトファイル)を出力しましたか? – 2501

+0

私は思い出しません。誰かが私に与えてくれたボイラープレートプロジェクトを使用しました。 – thomthom

関連する問題