如何設計出高效能的增益集?partII

如何設計出高效能的增益集?partII

在這幾個月一邊進行自己vb6的作品升級至vb.net的過程,vb6碼改成vb.net碼並不困難,但是比較麻煩的是一直被執行速度的問題所困擾,如果程式碼大一點,很明顯vb.net寫的增益集的執行速度在第一次執行時比vb6寫的慢很多,原因是vb6可以編譯成native code 發佈,而vb.net是在第一次執行時才即時編譯成native code,而每次重新執行office時都要vb.net所寫的增益集都要重新編譯,這樣的感覺對於使用者絕對不是好的經驗。一直在想微軟推這個.NET的架構難道只是要使用者要升級更高等級的硬體嗎?否則像一些硬體資源比較低階得電腦一裝上自己用VB.NET所寫的增益集,第一次執行可以說慢到想要打瞌睡,但是仔細一想,市面上很多用.NET開發的程式並沒有這樣嚴重的情況,而且很多程式看起來也蠻龐大的,所以問題應該不是.NET的問題,應該是自己沒有找到問題的關鍵。

隨著這幾個月的研究,才知道自己對於.NET FRAMEWORK 知識實在太淺了。在前一篇如何設計出高效能的增益集?PARTI 提到Just-in-time compilation的架構,自己卻不知道預編譯(Pre-Compile)的方法。在MSDN找了好久找到這一篇文章『逐步解說:使用自訂動作在安裝時將二進位編譯為機器碼』終於解決了我的問題,原來也可以讓.NET程式碼預先編譯為機器碼,讓程式不用每次執行都重新編譯。

舉例我有一個example.dll的增益集檔案,要使用這篇文章裏的範例程式將它預編譯,只要將範例專案程式一起封裝於安裝程式中加上安裝時的自訂動作屬性參數 /Args="[TARGETDIR]example.dll" ,便可以在程式安裝的過程將example.dll預先編譯為機器碼,並安裝至指定的目錄,執行程式時.net framwork會自動去此目錄載入預先編譯好的機器碼,而不會再執行編譯動作。

image

注意:

1.使用此篇文章的範例程式,記得將此程式編譯為32位元程式,不管是預編譯的對象是否為64位元。

2.可以在命令提示列利用 ngen.exe display "example.dll安裝的目錄" 檢查是否成功編譯。另外如果預編譯的對象是64位元的,記得要指定正確版本的ngen.exe,預編譯64位元的程式必須用64位元的ngen.exe,預編譯32位元的程式必須用32位元的ngen.exe,這兩個版本的ngen.exe是安裝在不同的目錄。像我的環境是64位元的環境ngen.exe就在C:\Windows\Microsoft.NET\Framework64\v4.0.30319\

cool      歡迎引用,請注明來源出處!

作者:楊煥謀