沒有辦法,它像一個樣品中很重要。 JIT沒有進入簡單的get
的可能性非常低。即使get
沒有內聯,多餘的函數調用不會是非常簡單的代碼之外的性能瓶頸。
爲了顯示我的意思,我在發佈模式下運行以下代碼(如果將其保留爲調試狀態,它將以不同的方式工作)。
private int Length { get; set; }
private int _length;
void Run()
{
Length = int.MaxValue;
_length = int.MaxValue;
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < Length; i++)
{
}
watch.Stop();
Console.WriteLine("Elapsed: {0}ms", watch.ElapsedMilliseconds);
watch.Restart();
for (int i = 0; i < _length; i++)
{
}
watch.Stop();
Console.WriteLine("Elapsed: {0}ms", watch.ElapsedMilliseconds);
}
我跑了10次,得到了以下的平均值:743毫秒爲屬性,740毫秒爲變量。這種差異可能僅僅是因爲我的機器上發生的嘗試和其他事情數量較少。
現在,如果通過屬性關閉內聯,您將獲得時間差異:屬性爲4577毫秒,變量爲775毫秒。現在這聽起來像是一個巨大的差異(總共6倍的時間),但請記住我的循環條件:20億次迭代。這意味着差異大約是每次操作2 ns。換言之,大約有4個時鐘週期,除了最極端的性能情況外,還不足以擔心。
您是否測量過該屬性會導致性能下降? 'get'ters通常很簡單,可以被JIT編譯器內聯,所以在字段和屬性之間不會有性能差異。 – dtb
作業:使用字節*擦除內存for循環。使用來自object = X ms的變量。使用property = 2 * X ms。所以財產很慢。當我將Length複製到局部變量(來自對象變量)時,它會給出另一個10%的速度。所以最後我使用了Length屬性,然後在每個for循環之前將它的值複製到局部變量。當然,當我使用long *來清除內存時,將Length更改爲局部變量會更有用。所以我解決了它。 – zgnilec