パフォーマンス上の利点をさらに得るには、クラスをシール済みとしてマークする必要があるという最適化のヒントをたくさん見てきました。
パフォーマンスの違いを確認するためにいくつかのテストを実行しましたが、違いは見つかりませんでした。何か間違ったことをしているのでしょうか? シールされたクラスの方がよい結果が得られるケースを見逃しているのでしょうか?
テストを実行して違いが見られた人はいますか?
ベストアンサー1
答えは「いいえ」でした。シールされたクラスは、シールされていないクラスよりもパフォーマンスが良くありません。
2021: 答えは「はい」です。クラスをシールするとパフォーマンス上の利点があります。
クラスをシールしても必ずしもパフォーマンスが向上するとは限りませんが、dotnet チームは、オプティマイザーに最大限の可能性を与えるために、すべての内部クラスをシールするというルールを採用しています。
詳細については、https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#ピーナッツバター
古い回答は以下にあります。
問題は、call
とcallvirt
IL のオペコードの違いにあります。Call
は よりも高速でcallvirt
、callvirt
主にオブジェクトがサブクラス化されているかどうかわからない場合に使用されます。そのため、クラスをシールすると、すべてのオペコードが から に変更されcalvirts
、calls
の方が高速になると想定されます。
残念ながらcallvirt
、null 参照のチェックなど、他にも便利な機能があります。つまり、クラスがシールされていても、参照が null である可能性があるため、 がcallvirt
必要になります。この問題は回避できます (クラスをシールする必要はありません) が、少し意味がなくなります。
構造体はcall
サブクラス化できず、null になることがないため、 を使用します。
詳細については、この質問を参照してください: