Является ли более эффективным использование перечислений вместо строковых массивов, с точки зрения производительности?Методы enum vs string методы
Я решил протестировать определенный метод IsDefined, вместо проверки соответствия в массиве строк. Я создал объект секундомера для проверки времени выполнения для каждого из них.
код ниже:
Определено перечисление за пределами класса Main:
enum Color : byte { red, blue, green }
Внутри Main:
string[] colArr = new string[] { "red", "blue", "green" };
string input = "green";
Stopwatch s1 = new Stopwatch();
int loopIterations = 0;
s1.Restart();
while (loopIterations++ < 100000000)
foreach (var blah in colArr)
if (blah == input)
break;
s1.Stop();
Console.WriteLine("Runtime for foreach loop: {0}", s1.Elapsed);
loopIterations = 0;
s1.Restart();
while (loopIterations++ < 100000000)
if (Enum.IsDefined(typeof(Color), input))
continue;
s1.Stop();
Console.WriteLine("Runtime for IsDefined method returned value: {0}", s1.Elapsed);
И мой результат выглядит следующим образом:
Runtime for foreach loop: 00:00:01.4862817
Runtime for IsDefined method returned value: 00:00:09.3421654
Press any key to continue . . .
Поэтому я хотел спросить, если, если бы код, который я написал, не был таким глупым или каким-то вещь - эти числа являются нормальными, и если они есть, то каким образом использование перечислений предпочтительнее использовать строковый массив, в частности, для вида рабочих мест оба будут?
Оба имеют свою собственную цель. Вы используете перечисления для API-интерфейсов, отличных от разработчиков, и вы используете строки для ввода пользователем. Что показали ваши исследования? – CodeCaster
Вы используете перечисление как строку, конечно, это менее эффективно. Вместо этого сохраните его как 'Color', f.e .:« Color input = Color.green; ». Тогда вам не нужно проверять, существует ли он. –
Вызов 'Enum.IsDefined (typeof (Color), input)', вероятно, будет фальсифицировать ваши вычисления, поскольку для этого требуется разобрать строку и сделать некоторые распаковки. Вы можете использовать 'Enum.GetValues' как эквивалент для' foreach (var blah in colArr) ', чтобы получить более правильный результат. – HimBromBeere