Что быстрее / эффективнее: Dictionary <string, object> или Dictionary <enum, object>? - PullRequest
13 голосов
/ 04 мая 2009

Являются ли 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";   
}

и

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

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

Ответы [ 5 ]

14 голосов
/ 04 мая 2009

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

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

5 голосов
/ 04 мая 2009

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

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

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

2 голосов
/ 04 мая 2009

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

1 голос
/ 04 мая 2009

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

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

0 голосов
/ 04 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...