0

冗長なキャストは最適化されますか? コンパイラが不要なダウンキャスト (つまりcastclass) を最適化していないことがわかります。しかし今、私はより単純なケースに興味があります。この質問は参照タイプのみに関係し、 には関係ありませんboxing

upcastそれはILを生成しないように思われるため、冗長な明示的なupcastコストはまったくかかりませんか? upcastまたは、IL 命令は型がないため、舞台裏で冗長な明示的なパフォーマンス コストが依然として存在しますか?

または、upcast は時々 IL 命令を生成しますか?

class Foo
{
}
class Bar : Foo
{
}
bool Test(object x)
{
    return x == null;
}
void Main()
{
    var x = new Bar();
    Console.Write(Test((Foo)x)); // redundant explicit to Foo, and then implicit to Object
    var y = new Bar();           // implicit to Object
    Console.Write(Test(y));
}

IL_0000:  newobj      UserQuery+Bar..ctor
IL_0005:  stloc.0     // x
IL_0006:  ldarg.0     
IL_0007:  ldloc.0     // x
IL_0008:  call        UserQuery.Test
IL_000D:  call        System.Console.Write
IL_0012:  newobj      UserQuery+Bar..ctor
IL_0017:  stloc.1     // y
IL_0018:  ldarg.0     
IL_0019:  ldloc.1     // y
IL_001A:  call        UserQuery.Test
IL_001F:  call        System.Console.Write
4

1 に答える 1

1

まず、これは非常にマイクロ最適化です。コードが正しく、読みやすいものになるように注意する必要があります。うまく機能しない部分を特定した場合にのみ、それらを最適化し、最適化が実際に役立ったかどうかを測定します。

第 2 に、IL にcastclass命令が含まれていたとしても、JIT されたアセンブリ コードで最適化される可能性があるため、パフォーマンスに影響を与えることはありません。

castclass第三に、アップキャスト(またはその他の命令)が必要になるケースが思い浮かびません。これは、IL ではメソッドがメタデータ トークンによって直接呼び出されるためです。そのため、メソッドの適切なオーバーロードを取得するためにアップキャストする必要はありません。また、IL には型推論がないため、いずれの場合も型パラメーターを明示的に指定する必要があります。つまり、castclassここでも必要ありません。

于 2013-07-11T21:30:57.437 に答える