2013-10-08 57 views
1

如果緩存屬性查找只是簡單地返回一個私有變量的值(或類似的便宜的東西),那麼在下面多次使用時會有什麼理由(或不要)?屬性查找的緩存

private sealed class Foo { 

    public string MyString { get; set;) 

} 


private void MyMethod(Foo foo1) 
{ 
    if (foo1.MyString != null) 
    { 
     DoSomething(foo1.MyString); 

     if (foo1.MyString.Length != 0) 
     { 
      DoSomething2(foo1.MyString.Length); 
     } 
    } 

} 

回答

2

會是什麼原因(或沒有)的緩存屬性查找,簡單地返回時不止一次類似下面用更多的是私有變量(或東西便宜類似)的價值?

一般來說,如果屬性getter只是返回一個字段(如您的示例),緩存它將是沒有必要的。這些類型的屬性訪問通常由JIT編譯器內聯,因此緩存對結果運行時幾乎沒有影響。

2

即使您的getter執行一些合理的計算來返回結果,仍然極不可能對緩存結果進行緩存,因爲在現代CPU中,內存不是CPU通常是瓶頸。

我見過一個好心的開發人員在私有成員變量中緩存字符串連接的結果以便「讓他的代碼更快運行」,但最終效果是減慢整個系統,因爲他只是簡單從系統的其他部分竊取RAM。那些其他部分正在使用它來緩存從磁盤或者網絡中傳出的數據,這些數據速度要慢得多,所以他的性能增益(以微秒爲單位)以犧牲其他地方的性能爲代價,以毫秒爲單位。一般情況下,避免優化,直到你已經對你的應用程序進行概要分析並且瞭解瓶頸在哪裏,並且不單獨在CPU上優化,你需要在分析時查看內存 CPU。