1

Mono でのネイティブ -> マネージド コンテキスト スイッチのオーバーヘッドの詳細を知っている人はいますか? つまり、C API を使用して .NET メソッドを呼び出す/.NET オブジェクトを作成することによって発生するオーバーヘッドです。

4

2 に答える 2

6

C コードからマネージ メソッドを呼び出すための現在の API には、次の種類のオーバーヘッドがあります。

  • 呼び出しているメソッドと合成されたヘルパー メソッドがコンパイルされているかどうかを確認するために、いくつかのロックおよびハッシュ ルックアップ操作を実行します。
  • メソッドがまだネイティブ コードにコンパイルされていない場合は、コンパイルされます。
  • 実際のメソッド呼び出しは高速であり、いくつかの回答の推測に反して、マーシャリングのオーバーヘッドは発生しないため、blittable 型やその他の考慮事項は適用されません。
  • 戻り値の型が値型の場合、値はボックス化されます。これにより、GC オーバーヘッドが発生します。void または参照型を返すメソッドの場合、オーバーヘッドがないことに注意してください。

上記の最初と最後のポイントのオーバーヘッドをなくす新しい API を導入します。それまでの間、1 秒あたり数百万回の呼び出しを行っていない限り、これらのオーバーヘッドは非常に小さく、ほとんどの場合、実際の作業を行うと呼ばれる実際のマネージ メソッドよりも小さくなります。

于 2009-08-18T06:41:07.627 に答える
2

特定の状況が十分に速いかどうかを知る唯一の方法であるため、特定の詳細が必要な場合はプロファイル...

そうは言っても、

Mono ネイティブ API は非常に高速です。Mono の C API を使用してオブジェクトを作成すると、基本的に、マネージド ランタイムがオブジェクトを作成するときと同じことを行います。メソッドの呼び出しも同様です。

実際のオーバーヘッドは、データをやり取りして変換しようとするときに発生します。オブジェクトを作成してメソッドを呼び出すだけでも、非常に高速です。複数の型を介してデータを変換しようとすると、少し遅くなります。ただし、C API の使用は非常に高速であるため、パフォーマンスの問題になる可能性はほとんどありません。(もちろん、これを非常にタイトなループなどで実行している場合を除きます。その場合は、ループをマネージ側のメソッドにリファクタリングし、それを 1 回呼び出すだけです。これにより、単一のコンテキスト スイッチが配置されます。 )

于 2009-08-18T00:25:48.060 に答える