代码之家  ›  专栏  ›  技术社区  ›  Ahmed

在什么级别C编译器或JIT优化应用程序代码?

  •  8
  • Ahmed  · 技术社区  · 16 年前

    我想知道这个信息来减少我的代码大小,这样我就不会浪费时间优化那些将由编译器或JIT完成的事情。

    例如:

    如果假定编译器内联对属性的get函数的调用,那么我不必将返回值保存在局部变量中以避免函数调用。

    我想推荐一个很好的参考资料来描述发生了什么?

    4 回复  |  直到 16 年前
        1
  •  18
  •   erlando    14 年前

    您可能想看看这些文章:

    JIT Optimizations - (Sasha Goldshtein - CodeProject)
    Jit Optimizations: Inlining I (David Notario)
    Jit Optimizations: Inlining II (David Notario)

    老实说,你不应该太担心这一层次的微观细节。让编译器/jit'er为您担心这个问题,它比您在几乎所有情况下都更擅长这个问题。别挂断电话 Premature Optimisation . 集中精力让代码正常工作,然后担心稍后的优化是否(a)它运行不够快,(b)您有“大小”问题。

        2
  •  17
  •   Marc Gravell    16 年前

    如果您担心性能问题,请运行分析器。 然后 更改代码。很可能你永远不会在一百万年内100%正确地猜测时间的去向。您可以更改0.02%的计时,并保留占负担62%的方法。你也可能使情况变得更糟。如果没有探查器和证据,你就是盲人。


    你不能 假定 JIT将内联一个属性getter。它可以这样做,也可以不这样做,原因有很多:方法体的大小、虚拟、值与引用类型、体系结构、附加的调试器等。

    “起重”还有一个地方,还可以实现节约 如果 在一个紧密的循环中反复调用代码;例如:

    var count = list.Count;
    for(int i = 0 ; i < count ; i++) {...}
    

    (忘了 for VS foreach 以上讨论——这是一个正交的讨论)。在上面,“起重机”将有助于性能。但只是为了 真的? 混淆-与数组相反,它更有效地 吊起它:

    for(int i = 0 ; i < arr.Length ; i++) {...}
    

    JIT识别这一点并删除边界检查(因为数组的大小是固定的)。

        3
  •  1
  •   Davy Landman    16 年前

    这看起来像是一种你不应该看到的微观优化。如果我没有弄错的话,这取决于应用哪种优化的CLR的体系结构和版本。

    如果你的方法被调用那么多, 真的? 如果想让它内联,你可以自己内联它,代价是要牺牲意大利面代码。

    我建议您分析您的算法,内联一个方法不会节省速度的大小,而一个更好的算法可以使您的运行时间从小时减少到秒。

        4
  •  -1
  •   Paul Biggar    16 年前

    JIT执行的最强大的优化通常是内联的。一个jit甚至可以嵌入数百个函数深度(我听到了jikesrvm的这个数字)。它们甚至会内联那些不总是可能内联的东西,如果需要的话,可以稍后将其退出(称为动态去优化)。

    一个不错的概述是 http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html .

    对于您的特定问题,我可能会说,如果所讨论的函数调用是 热的 .