2010-06-28 58 views
2

我正在編寫一個編譯器,這個編譯器的一個特性是它自動爲值類型生成GetHashCode(),Equals(object)和Equals({this value type})方法。眼下的Equals({此值類型})實現基本上產生IL等效於本C#生成的IL:對於大型.maxstack,性能會有什麼影響?

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

我的編譯器推動所有這些對象到堆棧中,然後開始進行比較和「和」把它們放在一起。這導致該方法的.maxstack很快變大。這是否有罰款?如果是這樣,我應該在什麼時候開始向當地人推銷價值?

謝謝。

回答

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 

這使用恆定的堆棧空間,無論字段的數量。

相關問題