Скорость логического выражения (C #) - PullRequest
2 голосов
/ 05 апреля 2009

Здравствуйте, я думал о том, что лучше написать (в отношении скорости и / или эффективности):

bool Method(...) { ... }

...

bool result = Method(...);

if (result == false)
{ ... }
// or

if (!result)
{ ... }

Или, альтернативно ...

if (result == true) 
// or

if (result)

Я спрашиваю, потому что я использую первый (result == false), но иногда он становится очень длинным, особенно в condition ? expr : expr выражениях.

Ответы [ 7 ]

9 голосов
/ 05 апреля 2009

Лично я съеживаюсь всякий раз, когда вижу что-то вроде result == false. На мой взгляд, это довольно неприятное неправильное использование оператора равенства и совершенно ненужное. Хотя я думаю, что компилятор должен превратить два выражения в один и тот же байт-код, вы определенно хотите использовать !result. На самом деле, это не только более прямое и логичное выражение, но, как вы упоминаете, делает код намного короче и более читабельным. Я думаю, что подавляющее большинство программистов на C # согласились бы со мной по этому вопросу.

4 голосов
/ 05 апреля 2009

Скорость выполнения одинакова - оба фрагмента компилируются в одно и то же представление кода MSIL.

Использование (result == false) вместо (!result) выглядит довольно небрежно.

2 голосов
/ 05 апреля 2009

Нет никакой разницы в производительности во время выполнения кода. Большинство руководств по кодированию в тех компаниях, где я работал, предпочитают! Результат.

1 голос
/ 05 апреля 2009

Я думаю, что есть три шага в этом процессе. Во-первых, вы полагаете, что в if всегда должно быть сравнение, поэтому пишите if (this.isMonkey == true) banana.eat ();

Или, более реалистично

if(SpeciesSupervisor.getInstance().findsSimilarTo(Monkey.class, 2) == true) {
    String f = new PropertyBundle("bananarepo").getField("banana store");
    EntitiyManager.find(Banana.class,f).getBananas().get(1).eat();
}

Затем вы узнаете, что можно спросить, если (this.isMonkey), и что это форматирование позволяет лучше читать как предложение в этом примере («если это обезьяна»).

Но, наконец, вы стареете и узнаете, что если (b) не очень читабельно и что если (b == true) дает вашему бедному мозгу некоторую подсказку о том, что здесь происходит, и что все эти резкие утверждения о «злоупотребление», «злоупотребление», Яда Яда, все немного преувеличены.

А что касается производительности. В Java это не будет иметь никакого значения. Я не думаю, что .NET намного хуже. Это самая простая оптимизация, которую может сделать компилятор, я бы поспорил, что производительность такая же.

Приветствия

Niko

1 голос
/ 05 апреля 2009

Несмотря на то, что я согласен с @Noldorin, что if(!result) предпочтительнее, я считаю, что if(result == false) и его аналог очень полезны, если вам нужно протестировать обнуляемый bool, что чаще всего происходит в сценариях доступа к данным.

Редактировать: Ниже приведен пример программы, в которой объясняются различные способы использования оператора равенства в необнуляемом bool.

class Program
{
  static void Main(string[] args)
  {
    TestNullBool(true);
    TestNullBool(false);
    TestNullBool(null);
    Console.ReadKey();
  }

  private static void TestNullBool(bool? result)
  {
    if (result == null)
    {
      Console.WriteLine("Result is null");
    }
    if (result == false)
    {
      Console.WriteLine("Result is false");
    }
    if (result == true)
    {
      Console.WriteLine("Result is true");
    }
  }
}
/* Output:
Result is true
Result is false
Result is null
*/
1 голос
/ 05 апреля 2009

Вы обязательно должны использовать выражение с! оператор не потому, что он быстрее, а потому, что он безопаснее.

Если вы случайно используете один знак равенства вместо двух, вы присваиваете значение переменной вместо сравнения значений:

if (result = false) {

Для других типов данных компилятор может это перехватить, поскольку выражение типа (id = 42) имеет целочисленное значение, поэтому его нельзя использовать в операторе if, но выражение типа (result = false) имеет логическое значение, поэтому компилятор должен принять это.

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

1 голос
/ 05 апреля 2009

Я не думаю, что есть какая-то разница, и если бы она была, вам, вероятно, было бы трудно ее измерить. Любая разница может быть связана с шумом измерения.

...