如果对于大型.maxstack有什么性能损失?

时间:2010-06-28 17:45:46

标签: performance compiler-construction clr cil

我正在编写编译器,这个编译器的一个特性是它自动为值类型生成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变得非常快。对此有处罚吗?如果是这样,我应该在什么时候开始将价值推向当地人?

感谢。

1 个答案:

答案 0 :(得分:2)

为什么不测量对您很重要的情景并找出答案?在.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

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