3

最適化が必要な計算コストの高いアプリケーション (NLP 機械学習タスク) をコーディングしています。

私のコードには多くの for ループがあるため、Parallel.For(およびそのバリアント) を使用して最も外側のループを並列化しました。また、配列とDictionarys を使用して、コストを大幅に削減するいくつかのインデックスを作成しました。

VS2010 のプロファイラーは、アプリケーションがほとんどの時間をDictionary.TryGetValue()(インデックスの副産物である) に費やすことを示しました。

これは、私がもっとうまくやれるかどうかという疑問を投げかけます。そしてどうやって?

私の最初の質問は、私のシナリオConcurrentDictionary.TryGetValueよりも優れ たパフォーマンスを発揮する一般的なコンセンサスがあるかどうかです。Dictionary.TryGetValue

.NET のコレクションよりもうまくいかない可能性があるため、独自のハッシュマップをコーディングする気はありません。しかし、私のシナリオでより高速なルックアップを保証するライブラリはありますか?

おそらく、ハッシュコードの実装が速度を落としているのでしょうか?

4

3 に答える 3

9

MSDN によると、Dictionary.TryGetValueは既に非常に最適化されています。

この方法は O(1) 操作に近づきます。

ディクショナリのキーについて言及していません。カスタム型を使用する場合は、そのGetHashCodeメソッドが適切に実装されていることを確認してください。ディクショナリとハッシュ テーブルはそれに依存し、広範囲に使用されます。

于 2013-05-16T07:21:08.543 に答える
4

私の最初の質問は、私のシナリオConcurrentDictionary.TryGetValueよりも優れたパフォーマンスを発揮する一般的なコンセンサスがあるかどうかです。Dictionary.TryGetValue

私はそれをテストしていませんが、通常、並行実装にはオーバーヘッドが追加され、全体的にわずかに遅くなると予想されます。違いは、アクセスを同期する必要がある場合です。つまり、読み取り中心のコードで辞書が必要な場合は、同時バージョン (ロックなし) の方が高速な場合があります。あなたのコードにはライターがないと言っているので、あなたはs を使用していないと思います。したがって、ある実装を他の実装よりも検討する理由はありません。とは言っても、プロファイリングする価値はあるかもしれませんが、たとえそれ速かったとしても(また、少し遅くなると思います)、私はそれがわずかに遅いと予想ますlocklock高速 - パフォーマンスが大幅に変わる可能性は低いです。

于 2013-05-16T07:21:18.583 に答える