【问题标题】:What is the performance penalty if any for a large .maxstack?大型 .maxstack 的性能损失是多少?
【发布时间】:2010-06-28 17:45:46
【问题描述】:

我正在编写一个编译器,这个编译器的一个特点是它会自动为值类型生成 GetHashCode()、Equals(object) 和 Equals({this value type}) 方法。现在 Equals({this value type}) 实现基本上生成的 il 与这个 c# 生成的 il 等效:

public bool Equals(ThisType o)
{
    return Field1 == o.Field1 && Field2 == o.Field2 && Field3 == o.Field3;//etc
}

我的编译器将所有这些对象推入堆栈,然后开始比较它们并将它们“和”在一起。这会导致方法的 .maxstack 很快变大。有这个惩罚吗?如果是这样,我应该在什么时候开始将值推送给本地人?

谢谢。

【问题讨论】:

    标签: performance compiler-construction clr cil


    【解决方案1】:

    您为什么不测量对您很重要的场景并找出答案?您的性能可能会因 .NET 版本或处理器架构而异,因此您需要真正衡量您关心的变体。据我了解,maxstack 主要用于验证,所以我不会有太多的性能损失,但唯一确定的方法是实际测量。

    此外,无论如何,在您的情况下,您不需要任何本地人来避免增加堆栈。你可以这样做:

      load Field1
      load o.Field1
      branch to end if not equal
      load Field2
      load o.Field2
      branch to end if not equal
      ...
      return true
    end:
      return false
    

    无论字段数如何,这都会使用常量堆栈空间。

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2012-01-04
      • 2011-02-22
      • 2023-03-13
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多