JIT编译器是否优化(内联)不必要的变量声明?

JRS*_*JRS 8 .net c# vb.net performance inline

我已经阅读了几篇文章和问题/答案,总结出最佳实践是让JIT编译器对内联函数调用进行所有优化.说得通.

内联变量声明怎么样?编译器是否也优化了这些?

就是这样:

        Dim h = (a + b + c) / 2       'Half-Perimeter

        If maxEdgeLength / (Math.Sqrt(h * (h - a) * (h - b) * (h - c)) / h) <= MaximumTriangleAspectRatio Then
           'Do stuff here.
        End If
Run Code Online (Sandbox Code Playgroud)

有比这更好的表现:

        Dim perimeter = a + b + c   'Perimeter
        Dim h = perimeter / 2       'Half-Perimeter

        Dim area = Math.Sqrt(h * (h - a) * (h - b) * (h - c)) 'Heron's forumula.
        Dim inradius = area / h
        Dim aspectRatio = maxEdgeLength / inradius

        If aspectRatio <= MaximumTriangleAspectRatio Then
            'Do stuff here.
        End If
Run Code Online (Sandbox Code Playgroud)

当然我更喜欢后者,因为它更容易阅读和调试,但如果它存在,我无法承受性能下降.

注意:我已经将此代码识别为瓶颈 - 不需要对过早优化进行反驳.:-)

Ben*_*igt 17

具有或不具有名称的临时变量是非问题.

但是你可以显着地优化这种不平等.

你的代码是:

If maxEdgeLength / (Math.Sqrt(h * (h - a) * (h - b) * (h - c)) / h) <= MaximumTriangleAspectRatio Then
Run Code Online (Sandbox Code Playgroud)

将两边乘以平方根,消除除法(保留不等式,因为平方根不能返回负数):

If maxEdgeLength <= (Math.Sqrt(h * (h - a) * (h - b) * (h - c)) / h) * MaximumTriangleAspectRatio Then
Run Code Online (Sandbox Code Playgroud)

现在,正方形两边消除那个昂贵的平方根:

If maxEdgeLength * maxEdgeLength <= h * (h - a) * (h - b) * (h - c) / h / h * MaximumTriangleAspectRatio * MaximumTriangleAspectRatio Then
Run Code Online (Sandbox Code Playgroud)

取消,然后乘以h.

If maxEdgeLength * maxEdgeLength * h <= (h - a) * (h - b) * (h - c) * MaximumTriangleAspectRatio * MaximumTriangleAspectRatio Then
Run Code Online (Sandbox Code Playgroud)

这会快得多.如果重复此计算,请考虑缓存此表达式的一部分结果,以获得更多改进.

使用注释来解释公式.摆脱Math.Sqrt瓶颈函数中的调用值得以不太简单的格式编写表达式.

  • +1用于识别可以在代码或编译中找不到优化,但算法本身. (6认同)

Ben*_*igt 5

顺便说一句,只是为了扮演魔鬼的拥护者,我也想指出这一点:

整个函数的JIT内联查看MSIL的长度(以字节为单位),而不是计算的复杂性.添加局部变量(并期望JIT注册它们)可能会增加函数的MSIL大小,使整个函数不能成为内联的候选者.

这不太可能与不必要的使用产生重大差异Math.Sqrt,但这是一种可能性.正如Eric Lippert所说,通过实际测量你会知道更多.但是,这样的测量仅对程序的一个特定运行有效,并且不会推广到经常调整JIT行为的不同处理器或.NET运行时的未来版本(包括服务包).因此,您需要一种综合的分析和经验方法来进行优化.