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

net中的方法调用有多贵

  •  10
  • Andrew  · 技术社区  · 14 年前

    通过内联代码调用方法的相对性能成本是多少?

    5 回复  |  直到 14 年前
        1
  •  20
  •   Jon Skeet    14 年前

    这取决于很多事情

    • jit是否为您内联
    • 不管是虚拟的
    • 参数的数量和大小
    • 是否为实例方法(带隐式空值检查)
    • 是否有返回值(如果有则返回其大小)

    非常, 非常 但不太可能成为你的瓶颈。和往常一样,先编写最可读的代码,然后对其进行基准测试,看看它是否有足够好的性能。如果没有,请使用探查器查找 可以 值得微观优化。

        2
  •  7
  •   Asad    14 年前

    有一个 cost 与方法调用关联;

    参数需要推送到堆栈上或存储在寄存器中,方法prolog和epilog需要执行等等。这些电话的费用可以通过 In-lining.

    但是, JIT 使用许多启发式方法来决定方法是否应在行中。影响jit的因素有以下几点,不在一条线上。

    • 大于32的方法 IL字节
    • 虚函数
    • 具有复杂流程的方法 控制
    • 包含 异常处理块
    • 如果任何方法是 参数是结构

    参考文献: Method Inlining

        3
  •  3
  •   TomTom    14 年前

    与C++相同。基本上是一个调用和一个返回,再加上设置参数。不过,请注意,jit可以内联方法调用,因此在特定的上下文中可能不像您想象的那样昂贵。

        4
  •  1
  •   Andrey    14 年前

    无关紧要。.net中的每个调用,至少对于c是虚拟调用,即使方法未标记为virtual,也要考虑它。

        5
  •  1
  •   Thomas    14 年前

    与使代码易于阅读和明确其意图相比,性能成本无关紧要,甚至无关紧要。