Будет ли разница в скорости между
if (myInt == CONST_STATE1)
а также
if (myEnum == myENUM.State1)
в C#?





В C# перечисления в любом случае встроены компилятором в константы, поэтому преимущество заключается в удобочитаемости кода.
Вы случайно не знаете тип такой константы?
И даже если бы была разница, она бы редко, если вообще когда-либо, была бы значительной.
@ Брайан, как насчет 3D-расчетов?
Тип данных? Его базовый тип по умолчанию - int32, если вы это имеете в виду.
В трехмерных расчетах нет ничего волшебного. Почему там дороже?
@ Адам: даже для трехмерных расчетов я сомневаюсь, что вы потратите много времени на эти сравнения. Если эти «если» составляют в сумме, скажем, 1% времени, вы не многого добьетесь, если сделаете это немного быстрее.
@jalf - гм, потому что расходы прямо пропорциональны количеству запусков операции. Нужно ли мне объяснять количество операций даже в простейшем 3D-моделировании? - Адам Нейлор (0 секунд назад) [удалить этот комментарий]
Что ж, это точно такой же спектакль. myEnum == myENUM.State1 преобразуется JIT в сравнение int. Кроме того, если в вашем перечислении меньше параметров, вы можете изменить его базовый тип на байтовый или короткий и использовать меньший тип данных, который обычно дает лучшую производительность.
Кроме того, я не уверен, что вам вообще нужно об этом беспокоиться. Это действительно похоже на преждевременную оптимизацию. Я уверен, что в любой системе есть более узкие места, чем сравнение перечислений. :)
При использовании Enums следует соблюдать осторожность, чтобы не использовать какие-либо операции, требующие отражения (или использовать их с осторожностью). Например:
В случае констант не существует возможности выполнять какие-либо операции, требующие отражения. Однако в случае перечислений это так. Так что будьте осторожны с этим.
Я видел отчеты профилей, в которых операции, связанные с проверкой / отражением перечисления, занимали до 5% времени ЦП (сценарий, в котором проверки перечисления выполнялись при каждом вызове метода API). Это можно значительно уменьшить, написав класс, который кэширует результаты отражения используемых типов перечислений.
Сказав это, Я бы рекомендовал принять решение об использовании enum vs. constant, исходя из того, что имеет смысл с точки зрения дизайна.. При этом необходимо убедиться, что команда осведомлена о последствиях для производительности операций, связанных с отражением.
Идеально. Это на самом деле отвечает на несколько других вопросов, которые у меня были! +1