2

マッピング目的でハッシュセット構造を使用しています: Dictionary<string, string>.

連続するステートメントで myHashset["key1"] の値を何度も読み取る必要がある場合、ローカル変数を使用して最初のルックアップを保存することをお勧めしますか?

編集:他のスレッドは辞書を変更しないため、重要な基準ではありません。

ありがとう!

4

5 に答える 5

7

はい。

O(1)アイテムの数に関係なく、操作にかかる時間は同じであると単純に述べています。
これは、単にローカル変数にアクセスするのと同じくらい速いという意味ではありません。

さらに、次の点を考慮してください。

  1. ローカル変数へのアクセスがはるかに読みやすくなりました
  2. TryGetValue通常、キーによってディクショナリ内の値にアクセスするときに、エラー処理を行うか、または使用する必要があります。ローカル変数を使用すると、このコードを 1 つの場所に保持でき、完全なメソッド全体に塗りつぶす必要がなくなります。
于 2012-08-29T07:41:10.987 に答える
3

はい:

  • 時間のかかる複数の O(1) ルックアップを回避します。
  • dictionary["key"]毎回書くよりずっと読みやすい
于 2012-08-29T07:41:44.357 に答える
1

これは、少なくとも次の 2 つの理由から優れた方法です。

  • 辞書は真の O(1) ではありません。データは内部的に小さなコレクションに分割されており、Dictionary はハッシュコードのおかげでどのコレクションを検索するかを認識しています。それでも、内部コレクションの列挙が関係しているため、操作は無料ではありません (ただし、高価ではありません)。

  • 値は別のスレッドから変更される可能性があります。参照を維持すると、コードをスレッドセーフにし、予期しない結果を防ぐのに役立ちます。

于 2012-08-29T07:43:07.830 に答える
1

O(1) 操作を n 回行うことは O(n) です!

これはマイナーな最適化ですが、すべてのマイナーな最適化が時期尚早というわけではありません。それは確かに時間を節約します。

編集:他のスレッドは辞書を変更しないため、重要な基準ではありません。

おそらく手元にあるケースではないかもしれませんが、グッドプラクティスとは何かという点では、手元にあるケースだけでなく、より広いケースを考慮する必要があります。なぜそうしているのかを知っている場合にのみ、私たちが逸脱するコード。

スレッド化を行わない理由は次のとおりです。

  1. 同じコードを繰り返し実行して、同じ結果を出しています。
  2. コンパイラがそれを認識して、1 回の呼び出しに書き直すことはほとんどありません。
  3. 可読性を高めることができます。

最後の点は考慮する価値があります。変数に名前を付けるたびに、コードを自己文書化する機会が得られます。何が起こっているかについてより明確なのは次のとおりです。

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 行の例ではなくコードです。

スレッド化では、次の問題になります。

  1. 可能な変更をインターリーブする必要がある場合、これを行うことはできません。
  2. それ以外の場合は、ローカルで作業していて、全体を通して同じローカルになることがわかっているため、スレッド化に伴う多くのリスクが取り除かれます。

したがって、一部のスレッド化のケースではこのアプローチが緩和され、非常に多くのケースがそれを主張していますが、これはもはや最適化ではなく、正確さのために不可欠です。

現在の状況を把握し、他のスレッドを考慮すると、さらに複雑になります。これは、別のスレッドが辞書を更新した場合に、問題のオブジェクトを変更できるようにしたい場合があるためです。しかし、ほとんどの場合、他のスレッドからの変更に直面しても同じオブジェクトを処理し続けることを本当に望んでいます。

したがって、ここでは重要ではありませんが、それでも一般的に良い習慣である理由です。

于 2012-08-29T08:13:29.663 に答える
0

うん...

あなた自身が答えを持っています。マイクロ秒とCPUサイクルを節約します。:)

于 2012-08-29T07:43:36.970 に答える