どちらがより高速/効率的か:辞書< string、object>または辞書< enum、object&gt ;?

StackOverflow https://stackoverflow.com/questions/820200

  •  03-07-2019
  •  | 
  •  

質問

辞書キーとして使用した場合、 enum 型は string 型よりも高速/効率的ですか?

IDictionary<string,object> or IDictionary<enum,object>

実際には、どのデータ型がディクショナリキーとして最も適しているのですか?

次のことを考慮してください:注:簡単にするために5つのプロパティのみ

struct MyKeys
{
   public string Incomplete = "IN"; 
   public string Submitted = "SU"; 
   public string Processing="PR"; 
   public string Completed = "CO"; 
   public string Closed = "CL";   
}

and

enum MyKeys
{
   Incomplete, 
   Submitted, 
   Processing, 
   Completed, 
   Closed
}

辞書のキーとして使用する場合、上記のどれがより良いでしょう!

役に立ちましたか?

解決

確かに、 enum のバージョンの方が優れています(もちろん、両方が適用可能であり、理にかなっている場合)。コンパイル時間をチェックし、よりクリーンなコードが得られるため、パフォーマンスだけでなく、(良くも悪くもなります。Rashackの非常に良いコメントを参照)

Dictionary&lt; int、object&gt; を使用して enum キーを int sにキャストするか、カスタム比較演算子を指定することにより、比較演算子の問題を回避できます。 。

他のヒント

まず、正確性に焦点を当てることから始めるべきだと思います。これは、プログラム内で発生する可能性のあるわずかなパフォーマンスの違いの最小の違いよりもはるかに重要です。この場合、私はあなたの型の適切な表現に焦点を合わせます(enumが最適だと思われます)。その後、アプリケーションのプロファイルを作成し、問題が発生した場合にのみ、修正する必要があります。

プロセスの後半でコードを高速化することは、通常、単純なプロセスです。 skolimaが提供したリンクを利用してください。 enumを選択した場合、アプリケーションの潜在的なパフォーマンスの問題を除去するのにおよそ10分の修正が必要でした。ここで可能性という言葉を強調したいと思います。これは間違いなくNHibernateにとって問題でしたが、それがあなたのプログラムにとって問題になるかどうかに関しては、用途によってのみ決定されます。

一方、プロセスの後半でコードをより正確にすることは、より困難になる傾向があります。十分に大きな問題では、人々は以前の悪い振る舞いの副作用に依存するようになります。これにより、他のコンポーネントを壊すことなくコードを修正できます。

enumを使用してよりクリーンで優れたコードを取得しますが、パフォーマンスに懸念がある場合は、カスタム比較を提供することを忘れないでください: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx

適用されない場合がありますが...

列挙型は 定数としてコンパイルすると、参照するすべてのアセンブリの再デプロイが発生する可能性があります変更された場合は列挙型。 (つまり、定数はコンパイル時にそれを使用するすべてのアセンブリにハードコードされます)。

enumバージョンの方が速いと思います。内部では、辞書はハッシュコードによってすべてを参照します。私の推測では、文字列のハッシュコードを生成するのが遅いということです。ただし、これはおそらく無視できるほど遅く、文字列比較のようなものよりも確実に高速です。私は列挙型がきれいだと言った他のポスターに同意します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top