Подтвердить что ты не робот

Тернар? оператор против обычного оператора If-else в С#

Возможный дубликат:
Не работает ли условный оператор?

Я являюсь массивным пользователем оператора ? в С#. Однако мой менеджер проектов часто предупреждает меня, что использование оператора ? может стоить некоторой производительности по сравнению с операторами If-Else в крупномасштабном приложении. Поэтому мне говорят, чтобы не использовать его. Тем не менее, я люблю использовать его, потому что он кратким и нечетким образом сохраняет код в чистоте.

Есть ли такая служебная нагрузка при использовании оператора ??

4b9b3361

Ответ 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