2009-08-17 10 views

答えて

5

Cコードから管理メソッドを呼び出すための現在のAPIは、オーバーヘッドのこれらの種類があります。

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

上記の最初と最後のポイントでオーバーヘッドを排除する新しいAPIを紹介します。一方で、毎秒何百万通ものコールをしていない限り、これらのオーバーヘッドはかなり小さく、実際の管理を行う方法ではほとんど問題になりません。

+0

ありがとうございました。 #1の場合、グローバルインタプリタロック(Pythonで)に類似したロックですか?また、#3では、複合型(クラス、...)はどのように渡されますか? – jameszhao00

+1

これはロックですが、PythonのGILとは関係がありません。すべてのPythonコードでGILを実行する必要があるため、その間に他のコードを実行することはできません。私が話していたロックは、基本的にハッシュ検索の間のみ保持され、残りのコードは他のコードと同時に実行できます。 複合クラスは単なる参照であり、マーシャリングが発生しないため、単なるポインタコピーです。あなたと他の人たちは、私たちがこのスレッドとP/Invokeメカニズムで話している埋め込み呼び出しAPIについて混乱しています。 – lupus

+0

ああ、私は参照してください。ありがとう。 – jameszhao00

2

言われていることそれはあなたがあなたの特定の状況が十分に高速であるかどうかを知っているだろう唯一の方法だからあなたは、具体的な詳細をしたいか、必要な場合はプロフィール、...

モノネイティブAPIにされますとても早い。 MonoのC APIを使用してオブジェクトを作成すると、オブジェクトを作成するときに管理されたランタイムと基本的に同じことが行われます。メソッドの呼び出しも同様です。

実際のオーバーヘッドは、データを渡したり、データを前後に変換しようとしています。オブジェクトを作成してメソッドを呼び出すだけで、驚くほど高速です。複数の型を使ってデータを変換しようとすると、やや遅くなります。しかし、C APIの使用は非常に高速であるため、パフォーマンス上の問題はありません。 (もちろん、非常にタイトなループやこれに類するものではない限り、ループをリファクタリングして、管理対象側のメソッドにループさせ、一度呼び出すだけで、単一のコンテキストスイッチが配置されます。 )

+1

それは非常に関連するタイプに依存します。いくつかのタイプはblittable(つまり、CとCLRの両方で全く同じ表現)なので、マーシャリングは必要ありません。呼び出し規約に従ってCALLとスタックに引数をプッシュするだけです。弦のような他のものは、最初に反対側で予想される形状にコピーしてマッサージする必要があります。 –

+1

はい - タイプのマーシャリングは高価な部分です。オブジェクトを作成してメソッドを呼び出すことは高速です(引数の整形を行う必要がない場合) –

+0

恐ろしいです。その情報をありがとう。 – jameszhao00

関連する問題