亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

重讀 CLR via C# 筆記

2019-11-17 03:14:11
字體:
來源:轉載
供稿:網友

重讀 CLR via C# 筆記

《CLR via C#》第四版

JIT性能

  為什么有時候有JIT的語言會比直接編譯為機器碼的語言快?

  簡而言之,就是JIT所知道的信息比那些在開發機上直接編譯為機器碼的的編譯器知道的信息更多,有的時候這些信息是如此的有用,以至于效果可以超過JIT本身的開銷和JIT編譯時間受限帶來的限制。《CLR》給出了如下三種具體的原因:

  1、 JIT知道當前正在使用的CPU的特性,可以使用那些在當前CPU上具備的新指令集。而傳統編譯器只能按照開發人員的指示,限制為僅使用較通用的指令集。更重要的是,這個過程是自動的,對開發人員透明的。

  2、 在執行環境中,程序中有些變量可能已經變為常量,如當前CPU核心數、當前進程是否為64位進程、進程啟動時的命令行參數,這樣程序中依賴這些變量的分支/邏輯就可以被優化。給JIT進一步優化最終代碼提供了操作空間。

  3、 JIT并未只生成代碼一次,在程序運行過程中,還可以監視那些部分是程序的熱點,即被大量反復執行的代碼,對這些代碼可以根據PRofile的信息重新生成更為優化的代碼。

  除此以外,我認為還有一個重要的原因是:

    JIT可以跨越程序集文件的邊界來進行優化、內聯,這些程序集在編譯生成的時候可能是在不同的時間、不同的機器上,傳統編譯器對此無能為力。

checked 關鍵字

  checked 關鍵字的作用范圍僅在當前所在函數內,不影響checked塊中調用的函數,所以下面這段代碼不會拋異常

class Program{    static void Main(string[] args)    {        checked        {            Test();        }    }    private static void Test()    {        byte a = 100;        a += 200;    }}

  其實想想也正常,checked關鍵字的作用是將數值運算編譯為帶檢查的IL指令,如果調用的函數在另一個程序集中,該程序集早已被編譯好,又如何改變呢?

  但注意:Decimal并非基本類型,四則運算沒有IL指令對應,所以不受checked影響,其運算始終會拋異常。

值類型和引用類型

  值類型表示不會額外為此對象在對上分配,而值類型自己可能被包含在一個引用類型中,所以值類型未必不會在堆上。

  值類型也用new關鍵字,容易給人造成誤解。

  值類型可以通過顯示指定將多個值類型的字段重疊在一起。

  只有C++/CLI才能獲得指向已裝箱的值類型的指針,C#只能先拆箱。

  當作為模板的類型參數時,值類型會強制CLR為它專門生成一份特化的代碼,而只有引用類型的模板實例可以共享代碼,減少內存占用。

個人經驗:

  引用類型new一次只有一個實例,而值類型則未必,當值類型被傳遞和修改,其行為需要仔細分析各個值類型變量的生存期,給開發人員帶來不小的負擔,這里面包括所謂的裝箱拆箱。建議只在局部范圍內或是作為只讀對象的情況下才考慮使用,因為C#碼農普遍沒有C++碼農那樣對對象生存期有明確的把握的能力,容易被豬隊友害死。

GC相關

  在GC回收時,某個對象即使沒超出C++意義上的生存范圍(所在的塊),但由于在下面未運行的代碼中沒有被引用所以一樣會被認為沒有被引用而被GC。在/debug模式下,對象生存期會延長到函數體結束。

using System; using System.Threading; public static class Program {     public static void Main() {         // Create a Timer object that knows to call our TimerCallback         // method once every 2000 milliseconds.         Timer t = new Timer(TimerCallback, null, 0, 2000);        // Wait for the user to hit <Enter>.         Console.ReadLine();     }     private static void TimerCallback(Object o) {         // Display the date/time when this method got called.         Console.WriteLine("In TimerCallback: " + DateTime.Now);  //Only once!        // Force a garbage collection to occur for this demo.         GC.Collect();     } }

  在進程正常結束的時候CLR也會執行GC過程,并釋放對象。

CriticalFinalizerObject

  對于非托管的資源,建議使用SafeHandle系列管理其句柄,其基類CriticalFinalizerObject有如下CLR級別支持的額外特性:

1、 從CriticalFinalizerObject繼承的類型首次被引用時,會JIT其析構函數,確保其在析構時不會因內存不足而失敗。

2、 在析構時,會優先析構其他不是從CriticalFinalizerObject繼承的對象,使得在普通類型的析構函數中可以使用CriticalFinalizerObject類型的對象。

3、 當整個AppDomain被強行卸載時,CriticalFinalizerObject對象的析構函數仍然會被調用。

  此外:

1、 SafeHandle對象可以在P/Invoke時替代IntPtr作為參數和返回類型,確保異常安全。

2、 P/Invoke時會正確管理內部的引用計數,確保多線程引用的情況下不會被提前意外釋放。

3、 CriticalHandle是不帶引用計數的SafeHandle。

4、 SafeHandle和CriticalHandle及其子類都是抽象類,在具體場景需要通過繼承的方式使用。

雜類

  dynamic類型被處理為Object+DynamicAttribute,所以不能通過Object和dynamic來實現不同的重載。

  const的值會在編譯時被內聯,readonly則不會,所以未來可能需要改動的值不應該用const。

  Nullable類型在裝箱時CLR會特殊處理,脫掉Nullable,即null被裝箱為null,v被裝箱為v,而不是Nullable<V>類型。

  可以通過AppDomain的FirstChanceException事件監視異常被拋出,但事件回調函數不能處理這個異常。

  如果一個異常沒有被CLR處理,被報告至Windows Error Reporting,那么它獲得的調用棧只能到最近一次被throw或是re-throw的位置,即re-throw對Windows Error Reporting無效,仍然會重置異常拋出點。

  在Catch和Finally塊中,線程不會被Abort所中斷.

  Environment.FailFast可以跳過普通的異常處理邏輯和對象Finalize方法直接結束進程。

  使用反射調用時,如果拋出異常,會將該異常包裹為TargetInvocationException;dynamic不受此影響。

  Constrained Execution Regions (CERs),該功能可以讓CLR預先在try塊之前“準備”一段代碼,而不是在運行過程中由于載入DLL失敗、類靜態初始化失敗等原因拋出異常。

  Thread.Sleep(0)可以將CPU讓給同優先級或更高優先級的線程,而Thread.Yield可以將CPU讓給更低優先級的,介于Thread.Sleep(0)和Thread.Sleep(1)之間。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看精品自拍私拍| 亚洲福利在线播放| 亚洲男人的天堂网站| 精品久久香蕉国产线看观看gif| 在线午夜精品自拍| 日韩**中文字幕毛片| 成人免费激情视频| 日韩精品视频观看| 777777777亚洲妇女| 欧美成人精品一区二区三区| 亚洲网站在线观看| 91精品国产91久久久久久最新| 亚洲欧美视频在线| 欧美日韩国内自拍| 亚洲精品久久久久| 黑人巨大精品欧美一区二区一视频| 久久精品国产欧美激情| 久久久精品在线观看| 成人疯狂猛交xxx| 亚洲精选中文字幕| 欧美日韩国产成人高清视频| 欧美亚洲视频一区二区| 在线播放精品一区二区三区| 久操成人在线视频| 国产精品尤物福利片在线观看| 欧美激情一区二区三区久久久| 亚洲欧美精品在线| 欧美日韩一区免费| 日韩a**中文字幕| 一区二区三区四区精品| 美女少妇精品视频| 国产精品xxx视频| 91高清免费视频| 91成品人片a无限观看| 亚洲国产黄色片| 久久久免费电影| 久久精品国产亚洲一区二区| 欧美成人免费全部观看天天性色| 2019av中文字幕| 国产一区在线播放| 国产日产欧美精品| 日韩一区二区三区国产| 91精品国产亚洲| 久久久噜噜噜久久久| 国产91精品高潮白浆喷水| 欧美最顶级丰满的aⅴ艳星| 国产精品三级在线| 欧美国产日韩中文字幕在线| 色综合天天狠天天透天天伊人| 91精品久久久久久久久久久久久久| 亚洲欧美另类国产| 日韩欧美成人网| 亚洲一区二区三区乱码aⅴ| 国产精品入口福利| 日韩国产高清污视频在线观看| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区在线免费| 成人中心免费视频| 国产一区二区三区在线| 亚洲国产另类 国产精品国产免费| 在线视频欧美日韩| 91亚洲国产成人精品性色| 亚洲欧美日本精品| 精品国内亚洲在观看18黄| 国产精品99久久久久久久久久久久| 欧美另类69精品久久久久9999| 欧美在线精品免播放器视频| 国产国语刺激对白av不卡| 国产精品福利观看| 国产中文字幕日韩| 久久亚洲综合国产精品99麻豆精品福利| 伊人男人综合视频网| 欧美午夜精品久久久久久人妖| 日韩在线播放av| 精品国内产的精品视频在线观看| 亚洲国产另类 国产精品国产免费| 国产热re99久久6国产精品| 久久久久久久影院| 国产精品视频永久免费播放| 成人福利视频在线观看| 国产97在线|亚洲| 成人午夜激情免费视频| 国产精品综合久久久| 欧美激情国产精品| 亚洲人成在线观看网站高清| 亚洲福利精品在线| 狠狠色狠狠色综合日日小说| 欧美激情成人在线视频| 高清欧美性猛交xxxx黑人猛交| 久久久女人电视剧免费播放下载| 欧美激情精品久久久久久久变态| 欧美成人中文字幕| 亚洲最大成人在线| 色综合老司机第九色激情| 色综合久久88色综合天天看泰| 国产精品成人av性教育| 色哟哟网站入口亚洲精品| 日韩在线资源网| 日韩一区av在线| 欧美天天综合色影久久精品| 日本精品性网站在线观看| 国产极品精品在线观看| 91精品久久久久久久久中文字幕| 国产伦精品免费视频| 日韩免费在线观看视频| 亚洲欧美另类人妖| 亚洲美女免费精品视频在线观看| 亚洲欧美日韩国产精品| 欧美性受xxx| 亚洲成人av片| 国产日韩专区在线| 国产精品777| 日韩av在线天堂网| 亚洲精品www久久久久久广东| 91免费视频国产| 91av在线播放| 午夜精品www| 日本精品va在线观看| 国产在线不卡精品| www.亚洲免费视频| 国内精品久久久久影院 日本资源| 亚洲aaaaaa| 欧美在线精品免播放器视频| 久久精品影视伊人网| 俺也去精品视频在线观看| 国产精品国语对白| 亚洲白虎美女被爆操| 欧美专区福利在线| 97香蕉久久夜色精品国产| 久久久国产精品亚洲一区| 久久国产精品久久精品| 亚洲精品动漫久久久久| 精品调教chinesegay| 欧美专区中文字幕| 伊人久久免费视频| 久久免费国产视频| 久久九九国产精品怡红院| 亚洲欧美中文日韩在线v日本| 国产激情999| 国产精品综合久久久| 亚洲欧美日韩国产精品| 国产精品视频自在线| 韩国精品久久久999| 韩国视频理论视频久久| 日韩中文字幕免费| 国产精品第3页| 美女撒尿一区二区三区| 欧美激情图片区| 日本久久久a级免费| 亚洲精品第一国产综合精品| 日韩在线免费视频观看| 性欧美xxxx| 欧美成人午夜激情| 亚洲日本aⅴ片在线观看香蕉| 日韩大陆欧美高清视频区| 国产99在线|中文| 亚洲国产成人在线视频| 91超碰caoporn97人人| 亚洲福利视频网| 亚洲免费视频网站| 国产精品自拍小视频| 欧美久久久精品| 午夜精品视频在线| 成人午夜激情免费视频|