Двойная условная производительность C # - PullRequest
0 голосов
/ 14 октября 2010

Что из этого будет быстрее для статического метода, называемого миллиарды раз в наносекунду:

Метод 1:

static bool DualConditional(int value)
{
   return A(value) && B(value);
}

Метод 2:

static bool DualConditional(int value)
{
   if(!A(value)
      return false;

    if(!B(value)
      return false;
}

Ответы [ 3 ]

7 голосов
/ 14 октября 2010

Они оба должны быть одинаковыми.

Первый замкнется и вернется, если A () будет ложным.

Первый также намного легче читать и понимать. Даже если бы производительность была чуть хуже, я бы использовал этот код. Преждевременная микрооптимизация бесполезна, когда читаемость приносится в жертву.

2 голосов
/ 14 октября 2010

Превратит ли компилятор C # Method1 в Метод2 автоматически

нет

Нет

и пропустить B (), если A () неверно?

Да

В общем код вроде

return A(value) && B(value);

быстрее

if(!A(value)
  return false;

if(!B(value)
  return false;

Поскольку первый вариант можно преобразовать в код x86, в котором не используются переходы.

Например, в коде:

    private static bool B_1(int value)
    {
        return value < 5;
    }

    private static bool B_2(int value)
    {
        if (value < 5)
            return true;
        else
            return false;
    }

Для B_1 C # генерирует немного более быстрый код x86, чем для B_2.

В этой конкретной ситуации я бы сказал, что это зависит от A () и B (). Я бы запустил его под профилировщиком, чтобы увидеть, что быстрее.

2 голосов
/ 14 октября 2010

&& короткое замыкание, что означает, что правая сторона оценивается, только если левая сторона проходит, в этом случае.Так что да,

return A(value) && B(value);

- это грубый эквивалент

if (A(value))
  if (B(value))
     return true;

return false;
...