代码之家  ›  专栏  ›  技术社区  ›  Florian Doyon

字节码大小对JIT/内联/性能有多大影响?

  •  3
  • Florian Doyon  · 技术社区  · 16 年前

    // in List<T>.Enumerator<T>
    public bool MoveNext()
    {
        List<T> list = this.list;
        if ((this.version == list._version) && (this.index < list._size))
        {
            this.current = list._items[this.index];
            this.index++;
            return true;
        }
        return this.MoveNextRare();
    }
    

    堆栈大小是3,字节码的大小应该是80字节。命名 MoveNextRare 方法让我非常警觉,它包含一个错误案例和一个空的集合案例,所以很明显这违反了关注点的分离。

    我想 MoveNext

    谢谢 弗洛里安

    2 回复  |  直到 16 年前
        1
  •  3
  •   Jon Skeet    16 年前

    如果你想知道 List<T>.Enumerator “奇”是为了表现,先考虑一下: 它是一个可变的结构 . 感到害怕就退缩;我知道我知道。

    最终,我不会开始模仿BCL的优化,而不去测试/分析它们在您的特定应用程序中所起的作用。它很可能适合BCL,但不适合你;别忘了BCL在安装时会经历整个NGEN类似的服务。唯一能找到适合你的方法 你的

    你说你想用同样的方法来解决你的性能瓶颈:这表明你已经做到了 知道

    试一试,衡量一下,然后根据这些证据做出决定,这并没有什么可怕的。

        2
  •  1
  •   Ben Voigt    16 年前

    将其分为两个功能有一些好处:

    如果方法是内联的,那么只有快速路径是内联的,错误处理仍然是函数调用。这可以防止内联占用过多的额外空间。但是80字节的IL可能仍然高于内联的阈值(它曾经被记录为32字节,不知道它是否在.NET2.0之后发生了变化)。

    它可以帮助CPU分支预测器优化更常见的路径(返回true)。