マッピング目的でハッシュセット構造を使用しています: Dictionary<string, string>
.
連続するステートメントで myHashset["key1"] の値を何度も読み取る必要がある場合、ローカル変数を使用して最初のルックアップを保存することをお勧めしますか?
編集:他のスレッドは辞書を変更しないため、重要な基準ではありません。
ありがとう!
マッピング目的でハッシュセット構造を使用しています: Dictionary<string, string>
.
連続するステートメントで myHashset["key1"] の値を何度も読み取る必要がある場合、ローカル変数を使用して最初のルックアップを保存することをお勧めしますか?
編集:他のスレッドは辞書を変更しないため、重要な基準ではありません。
ありがとう!
はい。
O(1)
アイテムの数に関係なく、操作にかかる時間は同じであると単純に述べています。
これは、単にローカル変数にアクセスするのと同じくらい速いという意味ではありません。
さらに、次の点を考慮してください。
TryGetValue
通常、キーによってディクショナリ内の値にアクセスするときに、エラー処理を行うか、または使用する必要があります。ローカル変数を使用すると、このコードを 1 つの場所に保持でき、完全なメソッド全体に塗りつぶす必要がなくなります。はい:
dictionary["key"]
毎回書くよりずっと読みやすいこれは、少なくとも次の 2 つの理由から優れた方法です。
辞書は真の O(1) ではありません。データは内部的に小さなコレクションに分割されており、Dictionary はハッシュコードのおかげでどのコレクションを検索するかを認識しています。それでも、内部コレクションの列挙が関係しているため、操作は無料ではありません (ただし、高価ではありません)。
値は別のスレッドから変更される可能性があります。参照を維持すると、コードをスレッドセーフにし、予期しない結果を防ぐのに役立ちます。
O(1) 操作を n 回行うことは O(n) です!
これはマイナーな最適化ですが、すべてのマイナーな最適化が時期尚早というわけではありません。それは確かに時間を節約します。
編集:他のスレッドは辞書を変更しないため、重要な基準ではありません。
おそらく手元にあるケースではないかもしれませんが、グッドプラクティスとは何かという点では、手元にあるケースだけでなく、より広いケースを考慮する必要があります。なぜそうしているのかを知っている場合にのみ、私たちが逸脱するコード。
スレッド化を行わない理由は次のとおりです。
最後の点は考慮する価値があります。変数に名前を付けるたびに、コードを自己文書化する機会が得られます。何が起こっているかについてより明確なのは次のとおりです。
CheckUpdated(dict[passedValue.split('\t')[1].Trim().ToUpperInvariant()]);
MarkLastCheckTime(dict[passedValue.split('\t')[1].Trim().ToUpperInvariant()]);
return GetStatus(dict[passedValue.split('\t')[1].Trim().ToUpperInvariant()];
または:
var purchaseOrderCode = dict[passedValue.split('\t')[1].Trim().ToUpperInvariant()];
CheckUpdated(purchaseOrderCode);
MarkLastCheckTime(purchaseOrderCode);
return GetStatus(purchaseOrderCode);
私は最初のケースでは少し意図的に不可解であり、同じ辞書をヒットし続けたとしても、実際にはその作業のいくつかを一度だけ実行する必要がありましたが、実際のコードでの影響は少なくなります。 4 行の例ではなくコードです。
スレッド化では、次の問題になります。
したがって、一部のスレッド化のケースではこのアプローチが緩和され、非常に多くのケースがそれを主張していますが、これはもはや最適化ではなく、正確さのために不可欠です。
現在の状況を把握し、他のスレッドを考慮すると、さらに複雑になります。これは、別のスレッドが辞書を更新した場合に、問題のオブジェクトを変更できるようにしたい場合があるためです。しかし、ほとんどの場合、他のスレッドからの変更に直面しても同じオブジェクトを処理し続けることを本当に望んでいます。
したがって、ここでは重要ではありませんが、それでも一般的に良い習慣である理由です。
うん...
あなた自身が答えを持っています。マイクロ秒とCPUサイクルを節約します。:)