整数の配列を返す独自の COM ライブラリがあります (もちろん、独自の独自形式で)。メイン UI スレッドからこの配列にアクセスすると、すべて問題なく、すばやく実行されます。別のスレッドからアクセスすると、アクセスが非常に遅くなります。以下にいくつかのサンプルコードがあります。
private void test() {
ProprietaryLib.Integers ints = ProprietaryLib.GetInts();
int x;
for(int i = 0; i < 500; i++)
for(int j = 0; j < ints.Count; j++)
x = ints[j];
}
private void button1_Click(object sender, EventArgs e) {
test(); // Very little time
new System.Threading.Thread(() => test()).Start(); // Lots of time
}
なぜこうなった?これをスピードアップする方法はありますか?マルチスレッドの代わりにマルチプロセッシングを使用した場合、パフォーマンスが向上する見込みはありますか? (うーん、もっと複雑に聞こえます。)
アップデート:
以下の回答に満足していますが、参考のためにここにいくつかのデータを追加したいと思いました(私自身と他の人のもの)。
上記のように新しいスレッドでオブジェクトを作成してアクセスすると、アクセスごとに約 12ns になります。おそらく、オブジェクトは実際にはメインスレッドで作成され、速度が遅いのはそこからデータをマーシャリングするためです。
メイン スレッドで明示的にデータを作成し、シングル スレッド アパートメントとしてマークされた新しいスレッドでアクセスすると、アクセス時間はさらに遅くなり、アクセスあたり 15 ns になります。.NET には、アパートを快適に保つための追加のオーバーヘッドが必要だと思いますが、そのオーバーヘッドが何であるかわからないことが心配です。わずか 2 ~ 3 ns の差があれば、それほど大きくなる必要はありません。
STA とマークされた新しいスレッドでオブジェクトを作成してアクセスすると、時間はアクセスごとに 0.2ns で溶けます。しかし、この新しいスレッドは本当に安全ですか? それは私が思う別の質問に対する質問です。