Что быстрее/эффективнее: словарь <строка, объект> или словарь <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
}
Какое из приведенных выше будет лучше, если использовать их в качестве словаря в словаре!
Ответы
Ответ 1
Конечно, версия enum
лучше (когда оба применимы и имеют смысл, конечно). Не только для производительности (это может быть лучше или хуже, см. Rashack очень хороший комментарий), поскольку он проверял время компиляции и приводит к более чистым кодам.
Вы можете обойти проблему сравнения, используя Dictionary<int, object>
и нажав клавиши enum
на int
или указав пользовательский сопоставитель.
Ответ 2
Я думаю, вы должны начать с фокусировки на правильности. Это гораздо важнее минимальной разницы между незначительными различиями в производительности, которые могут возникать в вашей программе. В этом случае я бы сосредоточился на правильном представлении ваших типов (перечисление представляется лучшим). Затем в дальнейшем профайл приложения и если есть проблема, тогда и только тогда вы должны его исправить.
Выполнение кода быстрее в этом процессе, как правило, является прямым процессом. Возьмите ссылку, которую предоставила сколима. Если вы выбрали перечисление, это было бы примерно 10-минутным исправлением для устранения проблемы производительности потенциал в вашем приложении. Я хочу подчеркнуть здесь потенциал слова. Это определенно проблема для NHibernate, но в отношении того, будет ли это проблемой для вашей программы, будет определяться исключительно использованием.
С другой стороны, сделать код более правильным позже в процессе, как правило, сложнее. В достаточно большой проблеме вы обнаружите, что люди начинают принимать зависимости от побочных эффектов предыдущего плохого поведения. Это может привести к исправлению кода, не нарушая работу других компонентов.
Ответ 3
Используйте enum, чтобы получить более чистый и приятный код, но не забудьте указать пользовательский сопоставитель, если вы заинтересованы в производительности: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx.
Ответ 4
Может не применяться, но...
Помните, что перечисления скомпилированы как constants, которые могут вызвать перераспределение всех сборок, которые ссылаются на перечисление, если оно изменено. (т.е. константа жестко запрограммирована во время компиляции для всех сборок, которые ее используют).
Ответ 5
Я бы предположил, что версия enum быстрее. Под капотом словарь ссылается на все по hashcode. Я предполагаю, что медленнее генерировать хэш-код для строки. Однако это, вероятно, небрежно медленнее, и, безусловно, быстрее, чем что-либо вроде сравнения строк. Я согласен с другими плакатами, которые сказали, что перечисление чище.