Что быстрее / эффективнее:Словарь<string,object> или Dictionary<enum,object>?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Являются перечисление печатает быстрее / эффективнее, чем строка типы при использовании в качестве ключей словаря?

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
}

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Используйте enum, чтобы получить более чистый и приятный код, но не забудьте предоставить пользовательский компаратор, если вас беспокоит производительность: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx .

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top