Стоимость HAVING, но НЕ выбрасывание исключения в методе в .NET - PullRequest
2 голосов
/ 21 декабря 2011

Этот вопрос не о стоимости создания исключений в .NET. В некоторых экспериментах некоторое время назад я видел значительное изменение в производительности метода, если оно содержало оператор throw где-то в одном из путей выполнения, фактически никогда не используя его. JIT как-то оборачивает какой-либо метод, который потенциально может вызвать исключение в каком-то дополнительном коде?

1 Ответ

5 голосов
/ 21 декабря 2011

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

Стратегия оптимизации, обычно используемая в коде платформы .NET, состоит в том, чтобы поместить операторы, которые бросаютисключение в вспомогательном методе, так что общий путь к коду все еще встроен.Видимый в методе Math.Abs ​​(), например:

public static int Abs(int value)
{
    if (value >= 0) return value;
    return AbsHelper(value);
}

private static int AbsHelper(int value)
{
    if (value == int.MaxValue) throw new OverflowException(...);
    return -value;
}

, который гарантирует, что сам метод Abs () встроен, и только отрицательные значения принимают неоптимальный путь кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...