2009-05-04 3 views
13

Есть enum типы быстрее/эффективнее, чем Строка Типы, используемые в качестве словарных ключей?Что быстрее/эффективнее: Словарь <строка, объект> или словарь <enum,object>?

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"; 
} 

и

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

Какой из выше будет лучше, если они используются в качестве ключей в словаре!

+0

Есть ли у C# эквивалент Java EnumMap? –

ответ

13

Конечно, версия enum лучше (когда оба применимы и имеют смысл, конечно). Не только для производительности (это может быть лучше или хуже, см. Очень хороший комментарий Rashack) как проверено время компиляции и результаты в чистом коде.

Вы можете обойти проблему сравнения с помощью Dictionary<int, object> и литью enum ключей на int с или указать произвольный сравнительный.

+9

Эффективность - это может быть не совсем так (удивительно) - http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx – Rashack

+1

Вы всегда можете указать свой собственный компаратор. Это не проблема с словарем или перечислением, но в сравнении –

5

Я думаю, вы должны начать с фокусировки на правильности. Это гораздо важнее минимальной разницы между незначительными различиями в производительности, которые могут возникать в вашей программе. В этом случае я бы сосредоточился на правильном представлении ваших типов (перечисление представляется лучшим). Затем, после того, как вы профилируете свое приложение и если есть проблема, тогда и только тогда вы должны его исправить.

Выполнение кода быстрее в процессе обычно является прямым процессом. Возьмите ссылку, которую предоставила сколима. Если вы выбрали enum, было бы исправлено примерно 10 минут, чтобы удалить потенциальную проблему с в вашем приложении. Я хочу подчеркнуть здесь потенциал слова. Это определенно проблема для NHibernate, но в отношении того, будет ли это проблемой для вашей программы, будет определяться исключительно использованием.

С другой стороны, более корректный код в дальнейшем в процессе имеет тенденцию быть более сложным. В достаточно большой проблеме вы обнаружите, что люди начинают принимать зависимости от побочных эффектов предыдущего плохого поведения. Это может привести к исправлению кода, не нарушая работу других компонентов.

1

Может не применять, но ...

Имейте в виду, что перечислений являются compiled в constants, которые могут привести к перераспределению всех сборок, которые ссылаются на перечисление, если она изменяется. (т. е. константа жестко запрограммирована во время компиляции для всех сборок, которые ее используют).

+0

так будет строка версии, поэтому я не буду следовать вашей точке. – Seabizkit

-1

Я бы предположил, что версия enum быстрее. Под капотом словарь ссылается на все по hashcode. Я предполагаю, что медленнее генерировать хэш-код для строки. Однако это, вероятно, небрежно медленнее, и, безусловно, быстрее, чем что-либо вроде сравнения строк. Я согласен с другими плакатами, которые сказали, что перечисление чище.

Смежные вопросы