2011-04-02 89 views
30

因此,當CLR運行時加載一個.NET程序集時,它會將其編譯到機器本機代碼中。這個過程被稱爲JITing。 NGen也是將.NET程序集編譯爲本地代碼的過程。我不明白兩者有什麼區別?JIT vs NGen - 有什麼區別?

回答

31

所不同的是當他們發生時。 JIT編譯在程序運行時發生。 NGen通常是在您的程序安裝時完成的,並且在您的程序運行之前發生。 NGen的目標之一是從應用程序啓動中刪除JIT懲罰。

+0

當我們有NGEN時,需要「JIT」嗎? – Imad 2017-06-01 09:20:26

6

從MSDN ...

機映像生成器(Ngen.exe)是一種工具,提高了管理的應用程序的性能。 Ngen.exe創建本地映像,這些映像是包含編譯的特定於處理器的機器代碼的文件,並將它們安裝到本地計算機上的本機映像緩存中。運行時可以使用緩存中的本機映像,而不是使用即時(JIT)編譯器來編譯原始程序集。

http://msdn.microsoft.com/en-us/library/6t9t5wcf(v=VS.100).aspx

基本上NGEN讓你預先JIT並緩存在本地計算機上的程序集。這允許更快的啓動和有時執行。

15

JIT只能按方法完成;它不會把所有東西都扔掉......只有你需要的東西。當然這在第一次進入方法(加上泛型等)時有一個小的但可衡量的打擊。 NGEN預先做了這項工作,但必須在相同的平臺/架構等上完成 - 實質上該機器。這也意味着將其添加到GAC等,這可能需要更高的訪問權限。

在很多情況下,JIT很好,特別是如果應用程序長時間打開(例如Web服務器)。

3

大量的在這裏留下了細節,但是:

JIT沒想象中的那麼......,JIT是剛剛在時間,這意味着它不會被編譯爲本地代碼,直到代碼,如一個方法,實際上是被調用的。在那之前只有存根。這將保持緩存,以便對該方法的後續調用不會重新生成本機代碼。

NGen一次完成整個裝配。 NGen一次完成所有工作,因此Jitting不是必需的。

8

尚未提及的一個非常重要的重要區別是,本機緩存的圖像具有「共享代碼頁」,這使得在終端服務或Citrix上運行的應用程序的內存佔用量發生巨大差異。

關鍵的事情,瞭解有關NGEN是,雖然它編譯你的代碼,它也標誌着代碼頁的共享,讓您的應用程序的多個實例可以共享由第一個實例所使用的存儲空間的部分。如果您在終端服務下運行,這非常有用。

http://blogs.msdn.com/b/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

這對多個用戶在單個機器上使用的應用程序具有非常重要的意義,因爲它們跨進程共享內存。如果圖像緩存不能很好地維護,這可能會導致非常奇怪,難以重現的行爲和資源管理問題。

+1

如果您在同一臺機器上運行同一個worker的> 100個實例(當因爲更好的隔離/穩定性而優先於線程的進程時),這也是相關的。 – mbx 2013-07-03 08:08:50

+0

內存共享也適用於Web花園,其中同一站點在單獨的W3WP.exe進程中加載​​多次。 JIT是否仍然不允許共享內存? – Brain2000 2014-02-20 15:45:39

+0

真的,這個好處適用於*無論何時*你有很多進程在同一臺機器上的同一個CLR上加載相同的二進制文件(可執行或不可執行文件),而不管爲什麼它是你擁有的。 – SamB 2015-12-08 04:27:14

相關問題