Будет ли CLR оптимизировать и встроить этот GetHashCode ()? - PullRequest
3 голосов
/ 08 сентября 2010

Допустим, у нас есть тип значения, подобный этому, где поля readonly и инициализированы во время построения:

public struct SomeValue
{
    private readonly Int32 field1;
    private readonly Int32 field2;

    ...
}

Также, скажем, у нас есть вспомогательный класс, который позволяет нам реализовать GetHashCode()для составных типов с возможностью повторного использования:

public struct SomeValue
{
    ...

    public override Int32 GetHashCode()
    {
        return HashHelpers.GetHashCode(this.field1, this.field2);
    }
}

Теперь компилятор должен понимать, что значения полей никогда не изменятся после создания типа, поскольку они равны readonly.Следовательно, вероятно ли, что вызов HashHelpers.GetHashCode() будет каким-то образом встроен, когда SomeValue.GetHashCode() является JIT-ed?

Ответы [ 4 ]

3 голосов
/ 08 сентября 2010

Вы не опубликовали код для своего метода HashHelper, но, поскольку он должен быть небольшим и быстрым, да, вполне вероятно, что он будет встроен.

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

Вы можете получить это, если используете const для инициализации поля только для чтения.И используйте тот же самый констант в реализации GetHashCode.Это довольно некрасиво.Учитывая очень ограниченную выгоду, которую вы получите от этой микрооптимизации, это, вероятно, не то, что вы должны учитывать.Возможная победа не больше, чем наносекунда или около того.Но, скорее всего, ноль, потому что оптимизатор заменит xor на mov.

3 голосов
/ 08 сентября 2010

Есть несколько хорошо известных правил для встраивания (.NET 4, возможно, добавил больше). В вашем случае, если HashHelpers.GetHashCode достаточно просто, оно будет встроено. Я не думаю, что эти поля только для чтения имеют какое-либо значение в этом контексте.

1 голос
/ 08 сентября 2010

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

Вот статья, в которой обсуждаются некоторые изэвристика, используемая джиттером .NET 3.5sp1.Это может измениться в .NET 4 и может измениться снова в будущих версиях.

0 голосов
/ 08 сентября 2010

Насколько я знаю, вызов HashHelpers.GetHashCode () не будет встроенным, он будет считаться обычным вызовом этого метода в CIL.Я могу ошибаться, но я вполне уверен, что я не так.

...