Тернар? оператор против обычного оператора If-else в С#
Возможный дубликат:
Не работает ли условный оператор?
Я являюсь массивным пользователем оператора ?
в С#. Однако мой менеджер проектов часто предупреждает меня, что использование оператора ?
может стоить некоторой производительности по сравнению с операторами If-Else
в крупномасштабном приложении. Поэтому мне говорят, чтобы не использовать его. Тем не менее, я люблю использовать его, потому что он кратким и нечетким образом сохраняет код в чистоте.
Есть ли такая служебная нагрузка при использовании оператора ?
?
Ответы
Ответ 1
Я запустил 100 миллионов Ternary Operators и 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.66ghz с 1 ГБ оперативной памяти, и я знаю, это отстой):
-
Тернарный оператор: 5986 миллисекунд или 0,00000005986 секунд на каждого оператора.
-
If-Else: 5667 миллисекунд или 0,00000005667 секунд на каждое утверждение.
Не забывайте, что я побежал на 100 миллионов из них, и я не думаю, что разница между этими двумя вопросами составляет 0,00000000319 секунд.
Ответ 2
Нет.
Используйте то, что делает ваш код доступным для чтения. Если это делают операторы if
, используйте их. Если это делают тройные операторы, используйте их.
Скорее всего, оба будут скомпилированы до одного и того же ИЛ.
В любом случае то, что замедлит ваше приложение, скорее всего, будет база данных или сеть или жесткий диск... что угодно, кроме того, что вы использовали операторы if
или тройные выражения.
Ответ 3
Нет никаких оснований ожидать каких-либо различий в производительности.
По моему мнению, тернарный оператор должен использоваться только в том случае, если все три операнда являются очень краткими и легко читаемыми. В противном случае я думаю, что у него есть потенциал, чтобы сделать код более трудным для чтения.
Я думаю, что многие люди ошибочно используют этот оператор, помещая слишком много логики в одну длинную строку кода. Я лично не буду использовать его, если вся строка меньше 80 символов.
Хорошо:
return isFunky ? funkyValue : null;
Плохо:
return (thisThing == thatThing && (anotherThing != null || ! IsThisTrue())) ? someThing.GetThis().GetThat() : yetAnotherThing.GetBlah().GetFoo();
Я видел, что люди намного хуже, чем выше. Я думаю, они должны потерять свои тернарные привилегии!
Ответ 4
Трудно прочитать трехмерные операции. Если вы используете вложенные условия, понимание троичности станет накладными расходами. Попытайтесь избежать тройного, если есть больше условий.
Ответ 5
С моей личной точки зрения, я не вижу различий в производительности между тернарным оператором и оператором if. Многие языки программирования поддерживают его, а оператор tenary более дружелюбен к разработчикам, поскольку обычный оператор If-else понятен в общем виде.
http://en.wikipedia.org/wiki/%3F%3a