Mono でのネイティブ -> マネージド コンテキスト スイッチのオーバーヘッドの詳細を知っている人はいますか? つまり、C API を使用して .NET メソッドを呼び出す/.NET オブジェクトを作成することによって発生するオーバーヘッドです。
2 に答える
C コードからマネージ メソッドを呼び出すための現在の API には、次の種類のオーバーヘッドがあります。
- 呼び出しているメソッドと合成されたヘルパー メソッドがコンパイルされているかどうかを確認するために、いくつかのロックおよびハッシュ ルックアップ操作を実行します。
- メソッドがまだネイティブ コードにコンパイルされていない場合は、コンパイルされます。
- 実際のメソッド呼び出しは高速であり、いくつかの回答の推測に反して、マーシャリングのオーバーヘッドは発生しないため、blittable 型やその他の考慮事項は適用されません。
- 戻り値の型が値型の場合、値はボックス化されます。これにより、GC オーバーヘッドが発生します。void または参照型を返すメソッドの場合、オーバーヘッドがないことに注意してください。
上記の最初と最後のポイントのオーバーヘッドをなくす新しい API を導入します。それまでの間、1 秒あたり数百万回の呼び出しを行っていない限り、これらのオーバーヘッドは非常に小さく、ほとんどの場合、実際の作業を行うと呼ばれる実際のマネージ メソッドよりも小さくなります。
特定の状況が十分に速いかどうかを知る唯一の方法であるため、特定の詳細が必要な場合はプロファイル...
そうは言っても、
Mono ネイティブ API は非常に高速です。Mono の C API を使用してオブジェクトを作成すると、基本的に、マネージド ランタイムがオブジェクトを作成するときと同じことを行います。メソッドの呼び出しも同様です。
実際のオーバーヘッドは、データをやり取りして変換しようとするときに発生します。オブジェクトを作成してメソッドを呼び出すだけでも、非常に高速です。複数の型を介してデータを変換しようとすると、少し遅くなります。ただし、C API の使用は非常に高速であるため、パフォーマンスの問題になる可能性はほとんどありません。(もちろん、これを非常にタイトなループなどで実行している場合を除きます。その場合は、ループをマネージ側のメソッドにリファクタリングし、それを 1 回呼び出すだけです。これにより、単一のコンテキスト スイッチが配置されます。 )