シールクラスは本当にパフォーマンス上の利点をもたらすのでしょうか? 質問する

シールクラスは本当にパフォーマンス上の利点をもたらすのでしょうか? 質問する

パフォーマンス上の利点をさらに得るには、クラスをシール済みとしてマークする必要があるという最適化のヒントをたくさん見てきました。

パフォーマンスの違いを確認するためにいくつかのテストを実行しましたが、違いは見つかりませんでした。何か間違ったことをしているのでしょうか? シールされたクラスの方がよい結果が得られるケースを見逃しているのでしょうか?

テストを実行して違いが見られた人はいますか?

ベストアンサー1

答えは「いいえ」でした。シールされたクラスは、シールされていないクラスよりもパフォーマンスが良くありません。

2021: 答えは「はい」です。クラスをシールするとパフォーマンス上の利点があります。

クラスをシールしても必ずしもパフォーマンスが向上するとは限りませんが、dotnet チームは、オプティマイザーに最大限の可能性を与えるために、すべての内部クラスをシールするというルールを採用しています。

詳細については、https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#ピーナッツバター

古い回答は以下にあります。

問題は、callcallvirtIL のオペコードの違いにあります。Callは よりも高速でcallvirtcallvirt主にオブジェクトがサブクラス化されているかどうかわからない場合に使用されます。そのため、クラスをシールすると、すべてのオペコードが から に変更されcalvirtscallsの方が高速になると想定されます。

残念ながらcallvirt、null 参照のチェックなど、他にも便利な機能があります。つまり、クラスがシールされていても、参照が null である可能性があるため、 がcallvirt必要になります。この問題は回避できます (クラスをシールする必要はありません) が、少し意味がなくなります。

構造体はcallサブクラス化できず、null になることがないため、 を使用します。

詳細については、この質問を参照してください:

呼び出しとcallvirt

おすすめ記事