一種加速應(yīng)用程序啟動(dòng)的方法和裝置的制造方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明屬于互聯(lián)網(wǎng)領(lǐng)域,尤其涉及一種加速應(yīng)用程序啟動(dòng)的方法和裝置?!?br>背景技術(shù):
】[0002]在應(yīng)用程序啟動(dòng)時(shí),根據(jù)啟動(dòng)的時(shí)機(jī)可以劃分為冷啟動(dòng)(coldstartup)和熱啟動(dòng)(warmstartup)兩種,在托管應(yīng)用程序環(huán)境中,冷啟動(dòng)是指_1\4丨(:1'030代(?/呢1Framework系統(tǒng)程序集和應(yīng)用程序代碼均不在內(nèi)存中時(shí),因而需要從磁盤提取它們;熱啟動(dòng)則是指應(yīng)用程序的后續(xù)啟動(dòng),或者當(dāng)大部分系統(tǒng)代碼因之前由另一托管應(yīng)用程序使用而已經(jīng)存在于內(nèi)存中時(shí)的應(yīng)用程序啟動(dòng)。[0003]由于應(yīng)用程序的啟動(dòng)速度直接影響了用戶對(duì)應(yīng)用程序的首次體驗(yàn)印象,因此對(duì)于提高應(yīng)用程序的啟動(dòng)速度顯得尤為重要。在應(yīng)用程序啟動(dòng),尤其是應(yīng)用程序冷啟動(dòng)時(shí),應(yīng)用程序需要從硬盤通過硬盤I/O讀入相應(yīng)的頁(yè)面,由于讀取的頁(yè)面會(huì)存放在不同文件或者目錄中,可能從第一個(gè)方件的某部分讀取一些頁(yè)面,又從第一個(gè)文件的相距較遠(yuǎn)的另一部分中讀入一些頁(yè)面,接著從另一不同的文件中讀入一些頁(yè)面,然后從一個(gè)目錄中讀入頁(yè)面后,再?gòu)牡谝粋€(gè)文件中讀入一些頁(yè)面,這樣會(huì)導(dǎo)致增加磁盤尋道時(shí)間,影響磁盤I/O的效率,從而導(dǎo)致應(yīng)用程序的啟動(dòng)速度過慢?!?br/>發(fā)明內(nèi)容】[0004]本發(fā)明實(shí)施例的目的在于提供一種加速應(yīng)用程序啟動(dòng)的方法,以解決現(xiàn)有技術(shù)中應(yīng)用程序啟動(dòng)時(shí),由于磁盤I/O效率低下而影響應(yīng)用程序啟動(dòng)過慢的問題。[0005]本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的,一種加速應(yīng)用程序啟動(dòng)的方法,所述方法包括:[0006]接收并解析所述應(yīng)用程序的可移植的執(zhí)行體文件和應(yīng)用程序的符號(hào)文件,根據(jù)所述符號(hào)文件在所述應(yīng)用程序中插入可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí);[0007]運(yùn)行所述插入了標(biāo)識(shí)信息的應(yīng)用程序,獲取所述標(biāo)識(shí)記錄的數(shù)據(jù)代碼運(yùn)行信息;[0008]根據(jù)所述記錄的數(shù)據(jù)代碼的運(yùn)行信息,改變所述數(shù)據(jù)代碼在可移植的執(zhí)行體文件中的存儲(chǔ)的位置信息。[0009]本發(fā)明實(shí)施例的另一目的在于提供一種加速應(yīng)用程序啟動(dòng)的裝置,所述裝置包括:[0010]解析插入單元,用于接收并解析所述應(yīng)用程序的可移植的執(zhí)行體文件和應(yīng)用程序的符號(hào)文件,根據(jù)所述符號(hào)文件在所述應(yīng)用程序中插入可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí);[0011]運(yùn)行獲取單元,用于運(yùn)行所述插入了標(biāo)識(shí)信息的應(yīng)用程序,獲取所述標(biāo)識(shí)記錄的數(shù)據(jù)代碼運(yùn)行信息;[0012]位置信息改變單元,用于根據(jù)所述記錄的數(shù)據(jù)代碼的運(yùn)行信息,改變所述數(shù)據(jù)代碼在可移植的執(zhí)行體文件中的存儲(chǔ)的位置信息。[0013]在本發(fā)明實(shí)施例中,根據(jù)接收和解析的應(yīng)用程序的符號(hào)文件,在解析的可移植的執(zhí)行體文件中加入可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí),在應(yīng)用程序運(yùn)行時(shí),得到數(shù)據(jù)代碼運(yùn)行信息,并且根據(jù)所述運(yùn)行信息調(diào)整數(shù)據(jù)代碼在可移植的執(zhí)行體文件中的存儲(chǔ)位置,使得應(yīng)用程序運(yùn)行時(shí)可以有效的減少硬盤I/O跳轉(zhuǎn)的次數(shù),提高讀取硬盤數(shù)據(jù)的效率,從而達(dá)到提高應(yīng)用程序的啟動(dòng)速度的目的?!靖綀D說明】[0014]圖1是本發(fā)明第一實(shí)施例提供的加速應(yīng)用程序啟動(dòng)的方法的實(shí)現(xiàn)流程圖;[0015]圖2是本發(fā)明第二實(shí)施例提供的加速應(yīng)用程序啟動(dòng)的方法的實(shí)現(xiàn)流程圖;[0016]圖3是本發(fā)明第三實(shí)施例提供的加速應(yīng)用程序啟動(dòng)的方法的實(shí)現(xiàn)流程圖;[0017]圖4為本發(fā)明第四實(shí)施例提供的加速應(yīng)用程序啟動(dòng)的裝置的結(jié)構(gòu)示意圖。【具體實(shí)施方式】[0018]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。[0019]本發(fā)明實(shí)施例可應(yīng)用于Windows操作系統(tǒng)環(huán)境下的應(yīng)用程序的啟動(dòng)速度的優(yōu)化,基于同樣的原理,也可以應(yīng)用于其它操作系統(tǒng)。以Windows操作系統(tǒng)為例,本發(fā)明技術(shù)方案在應(yīng)用程序的可移植的執(zhí)行體文件編譯出來后,完全不依賴于VisualC++compiler(VC++編譯器)與VisualStudiolinker(VS鏈接器)的幫助,通過對(duì)對(duì)可移植的執(zhí)行體(英文簡(jiǎn)稱為PE,英文全稱為PortableExecute)文件進(jìn)行數(shù)據(jù)代碼的重新布局存儲(chǔ)位置,使得其在啟動(dòng)階段速度加快,尤其是在冷啟動(dòng)階段,對(duì)I/O時(shí)間占用比較大的程序效果特別顯著。[0020]實(shí)現(xiàn)本發(fā)明的應(yīng)用程序的啟動(dòng)主要包括以下步驟:[0021]接收并解析所述應(yīng)用程序的可移植的執(zhí)行體文件和應(yīng)用程序的符號(hào)文件,根據(jù)所述符號(hào)文件在所述應(yīng)用程序中插入可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí);運(yùn)行所述插入了標(biāo)識(shí)信息的應(yīng)用程序,獲取所述標(biāo)識(shí)記錄的數(shù)據(jù)代碼運(yùn)行信息;根據(jù)所述記錄的數(shù)據(jù)代碼的運(yùn)行信息,改變所述數(shù)據(jù)代碼在可移植的執(zhí)行體文件中的存儲(chǔ)的位置信息。根據(jù)接收和解析的應(yīng)用程序的符號(hào)文件,在解析的可移植的執(zhí)行體文件中加入可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí),在應(yīng)用程序運(yùn)行時(shí),得到數(shù)據(jù)代碼運(yùn)行信息,并且根據(jù)所述運(yùn)行信息調(diào)整數(shù)據(jù)代碼的存儲(chǔ)位置,使得應(yīng)用程序運(yùn)行時(shí)可以有效的減少磁盤I/O跳轉(zhuǎn)的次數(shù),提高讀取數(shù)據(jù)的效率,從而達(dá)到提高應(yīng)用程序的啟動(dòng)速度的目的。[0022]經(jīng)過項(xiàng)目驗(yàn)證,對(duì)于冷啟動(dòng)時(shí)間為4.1秒的應(yīng)用程序,經(jīng)本發(fā)明所述技術(shù)方案的方法優(yōu)化后,啟動(dòng)時(shí)間達(dá)到1.9秒,程序冷啟動(dòng)時(shí)的硬頁(yè)故障(hardpagefault)由8000左右降到3000左右,極大的減少了I/O的讀取,提高啟動(dòng)效率。[0023]實(shí)施例一:[0024]圖1示出了本發(fā)明第一實(shí)施例提供的加速應(yīng)用程序啟動(dòng)的方法的實(shí)現(xiàn)流程,詳述如下:[0025]在步驟S101中,接收并解析所述應(yīng)用程序的可移植的執(zhí)行體文件和應(yīng)用程序的符號(hào)文件,根據(jù)所述符號(hào)文件在所述應(yīng)用程序中插入可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí)。[0026]具體的,所述可移植的執(zhí)行體是PortableExecute的中文全稱,其英文簡(jiǎn)稱為PE,常見的以EXE、DLL、OCX、SYS、COM后綴的文件都是PE文件,PE文件是微軟Windows操作系統(tǒng)上的程序文件,其中可能是間接被執(zhí)行,如DLL文件。[0027]所述符號(hào)文件(SymbolFiles)是一個(gè)數(shù)據(jù)信息文件,它包含了應(yīng)用程序二進(jìn)制文件(比如以EXE、DLL等為后綴的文件)的調(diào)試信息,專門用于調(diào)試,最終生成的可執(zhí)行文件在運(yùn)行時(shí)并不需要符號(hào)文件,但程序中所有的變量信息都記錄在這個(gè)文件中。用VisualC++和WinDbg調(diào)試程序時(shí)都要用到這個(gè)文件。[0028]在Windows系統(tǒng)中,符號(hào)文件以.pdb為擴(kuò)展名,比如:每個(gè)Windows操作系統(tǒng)下有一個(gè)⑶132.dll文件,編譯器在編譯該DLL文件的時(shí)候會(huì)產(chǎn)生一個(gè)⑶132.pdb文件,一旦你擁有了這個(gè)PDB文件,那么便可以用它來調(diào)試并跟蹤到⑶132.dll內(nèi)部。[0029]-般情況下,符號(hào)文件包括以下的數(shù)據(jù)信息:[0030]全局變量(Globalvariables);[0031]局部變量(Localvariables);[0032]函數(shù)名和它們的入口地址(Functionnamesandtheaddressesoftheirentrypoints);[0033]FP0數(shù)據(jù)(FramePointerOmission):FramePointer是一種用來在調(diào)用堆棧(Callstack)中找到下一個(gè)將要被調(diào)用的函數(shù)的數(shù)據(jù)結(jié)構(gòu)源代碼的行序號(hào)(Source-linenumbers)[0034]所述可用于記錄應(yīng)用程序的數(shù)據(jù)代碼運(yùn)行信息的標(biāo)識(shí),可以但不局限為每個(gè)訪問函數(shù)插入hook(勾子)函數(shù),通過使用EventTracingforWindows記錄下相關(guān)信息直到程序啟動(dòng)完畢,所述相關(guān)信息,比如可以為應(yīng)用程序啟動(dòng)過程中對(duì)應(yīng)用程序中的數(shù)據(jù)代碼的訪問的先后順序、訪問的時(shí)長(zhǎng)等。[0035]由于符號(hào)文件中記錄了應(yīng)用程序的函數(shù)的源代碼的行號(hào)以及函數(shù)的入口地址,因此可以根據(jù)入口地址及行號(hào)信息,方便的插入hook函數(shù)。[0036]在步驟S102中,運(yùn)行所述插入了標(biāo)識(shí)信息的應(yīng)用程序,獲取所述標(biāo)識(shí)記錄的數(shù)據(jù)代碼運(yùn)行信息。[0037]在步驟S101中對(duì)應(yīng)用程序插入了標(biāo)識(shí)信息后,運(yùn)行所述插入了標(biāo)識(shí)信息的應(yīng)用程序,通過能夠記錄標(biāo)識(shí)信息的應(yīng)用程序,如對(duì)于插入的hook函數(shù),對(duì)每一個(gè)function,倉(cāng)ij建一個(gè)function_thunk函數(shù),并用function_thunk取代原有的所有function的調(diào)用地址,通過EventTracingforWindows記錄應(yīng)用程序的調(diào)用信息。當(dāng)然,還可以通過其它與符號(hào)文件結(jié)合的方式,插入其它標(biāo)識(shí)信息獲取函數(shù)的調(diào)用信息。[0038]所述數(shù)據(jù)代碼的運(yùn)行信息,可以包括所述數(shù)據(jù)代碼的訪問順序。[0039]在步驟S103中,根據(jù)所述記錄的數(shù)據(jù)代碼的運(yùn)行信息,改變所述數(shù)據(jù)代碼在可移植的執(zhí)行體文件中的存儲(chǔ)的位置信息。[0040]其中,所述記錄的數(shù)據(jù)代碼的運(yùn)行信息,可以通過解析符號(hào)文件中包括的排序信息塊獲取。[0041]在得到數(shù)據(jù)代碼的運(yùn)行信息,比如運(yùn)行調(diào)用的先后順序等信息后,相應(yīng)的改變數(shù)據(jù)代碼在可移植的執(zhí)行體文件中的存儲(chǔ)位置,使其在使用較少次數(shù)的磁盤1/0,即可方便的調(diào)用其中的數(shù)據(jù),從而提高磁盤1/0效率。[0042]其中,在所述獲取所述標(biāo)識(shí)記錄的數(shù)據(jù)代碼運(yùn)行信息包括所述數(shù)據(jù)代碼的訪問順序時(shí),可以根據(jù)所述數(shù)據(jù)代碼的訪問地址和數(shù)據(jù)代碼的訪問順序,依次在硬盤中存儲(chǔ)所述數(shù)據(jù)代當(dāng)前第1頁(yè)1 2