Троичный? оператор против обычного оператора If-else в C#
Возможный дубликат:
Является ли условный оператор медленным?
Я большой пользователь ?
оператор в C#. Однако мой менеджер проекта часто предупреждает меня, что с помощью ?
Оператор может стоить некоторой производительности по сравнению с If-Else
заявления в крупномасштабном приложении. Поэтому мне сказали избегать его использования. Тем не менее, я люблю использовать его, потому что он лаконичен и в некотором роде сохраняет код в чистоте.
Есть ли такая производительность при использовании ?
оператор?
5 ответов
Я управлял 100 миллионами троичных операторов и 100 миллионами операторов If-Else и записывал результаты каждого из них. Вот код:
Stopwatch s = new Stopwatch();
// System.Diagnostics Stopwatch
int test = 0;
s.Start();
for(int a = 0; a < 100000000; a++)
test = a % 50 == 0 ? 1 : 2;
s.Stop();
s.Restart();
for(int b = 0; b < 100000000; b++)
{
if(b % 50 == 0)
test = 1;
else
test = 2;
}
s.Stop();
Вот результаты (работает на Intel Atom 1.66 ГГц с 1 ГБ оперативной памяти, и я знаю, это отстой):
Тройной оператор: 5986 миллисекунд или 0,00000005986 секунд на каждого оператора.
If-Else: 5667 миллисекунд или 0,00000005667 секунд для каждого оператора.
Не забывайте, что я пробежал 100 миллионов из них, и я не думаю, что разница между этими двумя вопросами составляет 0,00000000319 секунд.
Нет.
Используйте то, что делает ваш код читабельным. Если if
заявления делают это, используйте их. Если это делают троичные операторы, используйте их.
Вполне вероятно, что оба будут компилироваться до одного и того же IL в любом случае.
В любом случае вещи, которые будут замедлять работу вашего приложения, скорее всего, будут базой данных, сетью или жестким диском... все, кроме того, использовали ли вы if
заявления или троичные выражения.
Нет причин ожидать каких-либо различий в производительности.
На мой взгляд, троичный оператор следует использовать только в том случае, если все три операнда очень лаконичны и легко читаются. В противном случае я думаю, что это может сделать код труднее для чтения.
Я думаю, что многие люди неправильно используют этот оператор, засовывая слишком много логики в одну длинную строку кода. Я лично не буду использовать его, если вся строка не будет содержать около 80 символов.
Хорошо:
return isFunky ? funkyValue : null;
Плохой:
return (thisThing == thatThing && (anotherThing != null || ! IsThisTrue())) ? someThing.GetThis().GetThat() : yetAnotherThing.GetBlah().GetFoo();
Я видел, что люди делают намного хуже, чем выше. Я думаю, что они должны потерять свои троичные привилегии!
Очень трудно читать троичные операции. Если вы используете вложенные условия, понимание троичного становится накладными расходами. Старайтесь избегать троичных, если есть больше условий.
С моей личной точки зрения, я не вижу каких-либо различий в производительности между троичным оператором и оператором if. Многие языки программирования поддерживают его, и тенарный оператор более удобен для разработчиков, тогда как обычный оператор If-else понятен в общем смысле.