日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

在.net中為什么第一次執(zhí)行會(huì)慢?

 昵稱10504424 2013-11-08

眾所周知.NET在第一次執(zhí)行的時(shí)比第二第三次的效率要低很多,最常見的就是ASP.NET中請(qǐng)求第一個(gè)頁面的時(shí)候要等上一段時(shí)間,而后面任意刷新響應(yīng)都非常迅速,那么是什么原因?qū)е碌哪??為什么微軟不解決這個(gè)問題呢?

問題

首先大家可以在心底回答這幾個(gè)問題,這也是讀完本文之后會(huì)陸續(xù)解決的問題。

1.生成就是編譯嗎?

2.既然執(zhí)行過一次之后效率會(huì)高很多為什么微軟不解決這樣的問題呢?

3.預(yù)編譯比JITCompiler的方式好嗎?

效率比較

image

第一次執(zhí)行耗費(fèi)了399

第二次執(zhí)行耗費(fèi)了5

為什么差這么多呢?后面就讓我們來揭曉。

注:?jiǎn)挝徊皇莔s(毫秒)

生成就是編譯嗎?

首先我先回答第一個(gè)問題:生成也是編譯(語言編譯),只不過不是編譯成機(jī)器碼(匯編),而是“IL”,但一般人會(huì)聽到編譯都聯(lián)想到編譯成機(jī)器碼(匯編),所以大家最好叫生成。

既然在生成的時(shí)候沒有編譯成機(jī)器碼,那么計(jì)算機(jī)是如何執(zhí)行的呢?下面我們來看描述了方法首次調(diào)用的一幅圖,摘自網(wǎng)絡(luò)。

 

image

可以看出,在WriteLine下有個(gè)JITCompiler,沒錯(cuò)就是這個(gè)函數(shù)幫我們把WriteLine編譯成了機(jī)器碼。

那當(dāng)?shù)诙螆?zhí)行的時(shí)候JITCompiler會(huì)變成本地代碼,也就是說JITCompiler不會(huì)再次執(zhí)行了,順帶得到的好處就是效率提升了。

既然執(zhí)行過一次之后效率會(huì)高很多為什么微軟不解決這樣的問題呢?

為什么微軟不再VS生成的時(shí)候就編譯成機(jī)器碼呢?

其實(shí)微軟有提供相關(guān)的設(shè)置(預(yù)編譯),但不推薦使用。

微軟既然提供了預(yù)編譯為什么不把它設(shè)為默認(rèn)的呢?

這個(gè)就得跳到第三個(gè)問題咯,大家繼續(xù)往下看。

預(yù)編譯比默認(rèn)的方式好嗎?

多平臺(tái)支持

再寫完一個(gè)程序時(shí)(WinForm比較常見)可以發(fā)現(xiàn)可疑同時(shí)運(yùn)行在x86和x64的平臺(tái)上,那為什么x64的操作系統(tǒng)一開始會(huì)有那么多的x86軟件兼容問題呢?

image

其實(shí)針對(duì)x86和x64平臺(tái)的指令是有區(qū)別的,深入的我也不太了解,有大??梢约?xì)說說。

那為什么一次生成可以同時(shí)在x64和x86上同時(shí)運(yùn)行呢?

原因其實(shí)很簡(jiǎn)單:JITCompiler是在執(zhí)行方法時(shí)才會(huì)將IL編譯成機(jī)器碼,那么微軟當(dāng)然有辦法根據(jù)平臺(tái)的差異性編譯出對(duì)應(yīng)的機(jī)器碼。

忽略不適應(yīng)代碼

   1: if (numberOfCPUs > 1) {
   2: ...
   3: }

如果主機(jī)只有一個(gè)CPU,JIT編譯器不會(huì)為上述代碼生成任何CPU指令,那么這樣順帶的結(jié)果就是最終的代碼變得更小,執(zhí)行的更快(可能有人說扯淡,就算一個(gè)CPU的這段代碼也不會(huì)執(zhí)行啊,那么大家得考慮機(jī)器碼不是面向?qū)ο蟮恼Z言可能一個(gè)小小的if就會(huì)順帶很多指令)。

未來還有更多

這種優(yōu)化未來只會(huì)更多,因?yàn)镃LR在不停的更新。。。

拋棄預(yù)編譯嗎?

答案肯定是否的,預(yù)編譯有自己的優(yōu)勢(shì),如果你所寫的代碼只在一臺(tái)服務(wù)器或者少個(gè)數(shù)的服務(wù)器上運(yùn)行,那么完全可以針對(duì)服務(wù)器進(jìn)行預(yù)編譯,但面向多服務(wù)端、客戶端的程序還是最好采用JIT編譯。

 

結(jié)語

部分引自:CLR via C#(第三版)

其實(shí)我覺得.NET并不是完全的編譯型語言,從JIT編譯來看他也是一種解析執(zhí)行語言(把IL解析成機(jī)器語言)。

分類: .NET基礎(chǔ)
綠色通道: 好文要頂 關(guān)注我 收藏該文與我聯(lián)系
KAnts
關(guān)注 - 4
粉絲 - 20
+加關(guān)注
12
0
(請(qǐng)您對(duì)文章做出評(píng)價(jià))
上一篇:記”Uri.IsWellFormedUriString”中的BUG
posted @ 2013-11-07 11:13 KAnts 閱讀(2516) 評(píng)論(30) 編輯 收藏

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多