1

最近、実行時にC#コードを生成できることを知り、この機能を使用したいと思います。線と平面の交点の計算など、非常に基本的な幾何学的計算を行うコードがあります。計算の多くは同じ平面または同じ線に対して実行されるため、一部のメソッドに特化したコードを生成することで、パフォーマンス上の利点が得られると思います。そして何度も。交差点を計算するコードを特殊化することで、パフォーマンス上の利点を得ることができるはずです。

問題は、どこから始めればよいかわからないことです。いくつかのブログ投稿を読んだり、MSDNドキュメントを閲覧したりすることで、実行時にコードを生成するための2つの可能な戦略、式ツリーとIL.Emitに出くわしました。式ツリーの使用は、OpCodeやその他のさまざまなMSIL関連の複雑さについて何も学ぶ必要がないため、はるかに簡単に思えますが、式ツリーが手動で生成されたMSILと同じくらい高速かどうかはわかりません。それで、私がどの方法を使うべきかについての提案はありますか?

4

2 に答える 2

4

式ツリーは内部的にトラバースされ、自分で使用するのと同じ基本システム関数を使用して IL として出力されるため、両方のパフォーマンスは一般的に同じです。低レベル関数を使用してより効率的な IL を発行することは理論的には可能ですが、実際に重要なパフォーマンスの向上があるとは思えません。それはタスクによって異なりますが、式ツリーによって発行されたものと比較して、発行された IL の実際的な最適化には至っていません。

CLR アセンブリを逆コンパイルするILSpyというツールを入手することを強くお勧めします。これで、コードが実際に式ツリーをトラバースし、実際に IL を出力するのを見ることができます。

最後に、注意事項です。私は言語パーサーで式ツリーを使用しました。関数呼び出しは、実行時にファイルからコンパイルされる文法規則にバインドされます。コンパイル済みがここでの鍵です。私が遭遇した多くの問題では、達成したいことがコンパイル時にわかっている場合、実行時のコード生成によってパフォーマンスが大幅に向上することはありません。一部の CLR JIT 最適化は、動的コードでも使用できない場合があります。これは私の実践からの意見に過ぎず、ドメインは異なるでしょうが、パフォーマンスが重要な場合は、ネイティブ コード、高度に最適化されたライブラリを検討します。LAPACK/MKL を使用していない場合、私が行った作業の一部は非常に遅くなります。しかし、それは求められていないアドバイスの一部にすぎないので、塩の粒で受け取ってください.

于 2012-01-15T01:16:47.127 に答える
2

私があなたの状況にあった場合、「必要な時間と労力」を増やし、再利用性の順序を減らすことで、高レベルから低レベルへの代替案を試し、当面のパフォーマンスが十分に良好になるとすぐに停止します。

  • まず、Math.NET、LAPACK、または同様の数値ライブラリに既に同様の機能があるかどうかを確認するか、コードをニーズに合わせて調整/拡張できるかどうかを確認します。

  • 次に、式ツリーを試してみます。

  • 3 番目に、 Roslyn Projectを確認します (プレリリース バージョンですが)。

  • 4 つ目は、一般的なルーチンを安全でない C コードで書くことです。

  • [5番目に、辞めて別の職業で新しいキャリアを始めることを考えます:)]、

  • これらのいずれもうまくいかない場合にのみ、実行時に IL を発行しようとするのは絶望的です。

しかし、おそらく私は低レベルのアプローチに対して偏見を持っています。あなたの専門知識、経験、視点は異なる場合があります。

于 2012-01-15T17:33:02.290 に答える