будет ли оптимизирован этот простой условный оператор во время компиляции? (.сеть) - PullRequest
4 голосов
/ 02 ноября 2011

Работая с устаревшим кодом, я обнаружил, что получил много утверждений (более 500), подобных этому

bool isAEqualsB = (a == b) ? true : false;

Есть ли смысл переписывать это так?

bool isAEqualsB = (a == b)

Или будет оптимизирован во время компиляции?

Заранее спасибо,

Santi! =)

Ответы [ 4 ]

8 голосов
/ 02 ноября 2011

Игнорировать производительность - это , поэтому вряд ли будет узким местом, это не должно быть тем, о чем вы думаете, пока не докажет , что оно соответствует соответствующим тестам.

Я бы абсолютно позаботился бы о удобочитаемости - и с этой точки зрения я считаю, что второй подход гораздо лучше, и, безусловно, использовал бы его.

РЕДАКТИРОВАТЬ:С точки зрения оптимизации, похоже, что компилятор C # не оптимизирует его:

  // First form
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  beq.s      IL_0007
  IL_0004:  ldc.i4.0
  IL_0005:  br.s       IL_0008
  IL_0007:  ldc.i4.1
  IL_0008:  stloc.0

  // Second form
  IL_0009:  ldarg.0
  IL_000a:  ldarg.1
  IL_000b:  ceq
  IL_000d:  stloc.1

Однако, разумеется, дело не в IL, а в том, что делает JIT-компилятор.Теперь даже разница в размере IL может означать разницу между встраиванием и не ...

4 голосов
/ 02 ноября 2011

Имеет смысл заменить первое утверждение независимо от того, будет оно оптимизировано или нет.

bool isAEqualsB = (a == b)

Это просто более чистый код a == b это логическое выражение, больше ничего не нужно. Думайте об этом как о рефакторинге, чтобы улучшить удобство сопровождения и читаемость вашей кодовой базы, а не обязательно выигрыш в производительности.

2 голосов
/ 02 ноября 2011

Определенно переписать его. Компилятор может выполнить эту оптимизацию, но это не важно, так как код будет намного более читабельным, если вы потратите время на его исправление.

Еще лучше, в первую очередь покончить с этими объявлениями переменных и заменить их использование на a == b.

Кроме того, найдите того, кто написал этот код, и дайте им сглаз:)

1 голос
/ 02 ноября 2011

Если код работает, я бы оставил все как есть. Время, которое вы потратите на переписывание, никогда не окупится. Да, второй подход чище и проще для чтения, но вам потребуется время, чтобы изменить более 500 вхождений этого шаблона, и вероятность ошибки - превращение рабочего кода в нерабочий код - не нуль. Небольшое преимущество читабельности, которое вы получите от рефакторинга, не компенсирует время и риск, связанный с внесением изменений.

Что касается выполнения, то компилятор почти наверняка оптимизирует первое во второе. Но, как говорили другие, даже если компилятор не оптимизировал это, прирост производительности был бы минимальным.

Но я бы определенно использовал второй подход для нового кода.

...