首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 4.0 新特性探秘 (六):dynamic 關鍵字在迴圈中的快取行為分析

     編輯:關於C語言

迴圈內單一快取

相同動態呼叫在迴圈中僅產生一個 CallSite 快取:


dynamic d = 5;
for (int i = 0; i < 100; i++) d.ToString();

反編譯 IL (簡化)


object d = 5;
for (int i = 0; i < 100; i++)
{
    if (<Main>o__SiteContainer0.<>p__Site1 == null)
        <Main>o__SiteContainer0.<>p__Site1 = CallSite<Action<CallSite, object>>.Create(...);
    <Main>o__SiteContainer0.<>p__Site1.Target(<Main>o__SiteContainer0.<>p__Site1, d);
}

靜態巢狀類別 <Main>o__SiteContainer0 持有唯一 CallSite 欄位 <>p__Site1。

非迴圈環境:每次呼叫各自快取

連續兩行 d.ToString(); 會產生 <>p__Site1 與 <>p__Site2 兩個獨立快取。推測原因:編譯器難以靜態識別相同呼叫點,且非熱點路徑不值得投入複雜分析。

結論

  • 熱點迴圈中 dynamic 呼叫經快取優化,效能損耗可控。
  • 散落呼叫會產生多餘快取,增加記憶體壓力。
  • 建議:高頻動態呼叫集中在迴圈或提取為區域委派。

(測試環境:VS2010 Beta1)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved