28

ピクセルごとの衝突チェックを行う XNA ゲームを作成しています。これをチェックするループは、int とビットごとの ORing をシフトすることによってチェックしますが、一般的に読みにくく、理解するのが困難です。

private bool IsTransparent(int pixelColorValue)ループを読みやすくするためにプライベート メソッドを追加したいのですが、これはパフォーマンスに非常に敏感なコードであるため、メソッド呼び出しのオーバーヘッドは望ましくありません。

コンパイラにこの呼び出しを強制的にインライン化する方法はありますか?それとも、コンパイラがこの最適化を行うことを願っていますか?

これを強制する方法がない場合、逆アセンブリを読む以外に、メソッドがインライン化されているかどうかを確認する方法はありますか? メソッドがインライン化されていて、他の呼び出し元が存在しない場合、メソッドはリフレクションに表示されますか?

編集:強制できないので、検出できますか?

4

10 に答える 10

27

いいえ、できません。さらに、インライン化を決定するのは、コードを取り込んで IL に変換する VS コンパイラではなく、IL を取り込んでマシン コードに変換する JIT コンパイラです。これは、JIT コンパイラだけがプロセッサ アーキテクチャについて十分に把握しており、メソッドをインライン化することが適切かどうかを判断できるためです。これは、命令のパイプライン処理とキャッシュ サイズのトレードオフであるためです。

したがって、.NET Reflector を見ても役に立ちません。

于 2009-03-05T21:56:50.393 に答える
18

「System.Reflection.MethodBase.GetCurrentMethod().Name を確認できます。メソッドがインライン化されている場合は、代わりに呼び出し元の名前が返されます。」

--ジョエル・コーホーン

于 2009-03-05T21:56:01.410 に答える
16

ここで説明されている.net4.5でより積極的なインライン化を促進する新しい方法があります:http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/20/aggressive-inlining-in-the -clr-4-5-jit.aspx

基本的には、可能であればコンパイラーにインライン化するように指示するための単なるフラグです。残念ながら、現在のバージョンのXNA(Game Studio 4.0)では利用できませんが、XNAが今年VS2012に追いついたときに利用できるようになるはずです。どういうわけかMonoで実行している場合は、すでに利用可能です。

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static int LargeMethod(int i, int j)
{ 
    if (i + 14 > j) 
    { 
        return i + j; 
    } 
    else if (j * 12 < i) 
    { 
        return 42 + i - j * 7; 
    } 
    else 
    { 
        return i % 14 - j; 
    } 
}
于 2012-03-20T17:48:45.493 に答える
1

安全でないコード(既知のインラインc)を使用し、c / c ++スタイルのポインターを使用しないのはなぜですか。これはGCからは安全です(つまり、コレクションの影響を受けません)が、独自のセキュリティへの影響があります(インターネットゾーンアプリの使用はできません)。しかし、特にパフォーマンスで、さらには配列やビット単位の操作で達成しようとしているように見える種類のことには優れていますか?

要約すると、アプリのごく一部のパフォーマンスが必要ですか?安全でないコードを使用し、ポインタなどを使用することは私にとって最良の選択肢のようです

編集:ちょっとしたスターター? http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

于 2009-03-05T23:01:19.740 に答える
1

いいえ、できません。

基本的に、最近のほとんどの C++ コンパイラでもそれを行うことはできません。inlineコンパイラへの単なるオファーです。取るか取らないかは自由です。

C# コンパイラは、IL レベルで特別なインライン化を行いません。JITオプティマイザーはそれを行うものです。

于 2009-03-05T21:51:19.733 に答える
0

コンパイラにこの呼び出しを強制的にインライン化する方法はありますか?それとも、コンパイラがこの最適化を行うことを願っていますか?

関数をインライン化する方が安価な場合は、インライン化します。したがって、プロファイラーが実際に問題であると言わない限り、心配する必要はありません。

詳細については

.NET 3.5 SP1 での JIT の機能強化

于 2009-03-06T00:07:22.607 に答える
0
于 2019-03-02T23:37:10.487 に答える