專(zhuān)利名稱(chēng):一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式系統(tǒng),更具體的說(shuō),是涉及一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法。
背景技術(shù):
Qtopia是由Trolltech公司基于Qt/Embedded開(kāi)發(fā)地第一個(gè)嵌入式地窗口環(huán)境和應(yīng)用程序,有PDA和PHONE兩種不同的版本。它被廣泛用于PDA、手機(jī)、網(wǎng)絡(luò)設(shè)施、掌上設(shè)備等。它包括全套的個(gè)人信息管理PIM(Personal InformationManagement),如地址本、電腦、日程安排、MPEG播放、圖像顯示、瀏覽器等,當(dāng)然也還有Email、游戲、配置工具。
當(dāng)前,QT在PC上的性能是非常好的。有了qvfb,Qtopia程序也可以在Intel XScale PXA 255上運(yùn)行。在PC上,整個(gè)Qt/Qtopia任務(wù)欄的啟動(dòng)時(shí)間不到1秒,其中第一次啟動(dòng)是0.8秒,第二次啟動(dòng)是0.4秒。第二次時(shí)間要短于第一次是因?yàn)椴糠帜繕?biāo)文件已經(jīng)存在于內(nèi)存中了。
但是Qtopia在Intel XScale PXA 255上的成績(jī)就不是那么好了。在本次實(shí)驗(yàn)的板子上,整個(gè)Qtopia啟動(dòng)大約花了28秒。Qtopia啟動(dòng)時(shí)間是指Application::exec調(diào)用發(fā)生之前的時(shí)間。這是由于Qt/Embedded是用C++實(shí)現(xiàn)的,所以在幾種成熟的GUI中系統(tǒng)資源消耗最大。所以有必要對(duì)它進(jìn)行優(yōu)化。
改進(jìn)Qtopia圖形函數(shù)庫(kù),提升熱點(diǎn)函數(shù)的性能,增加緩存,都可以對(duì)Qtopia進(jìn)行優(yōu)化,但是,使用這些優(yōu)化,基本都沒(méi)有對(duì)Qtopia的底層函數(shù)進(jìn)行任何修改,僅僅是使用外部工具,或者改變Qtopia的畫(huà)圖方法,這樣沒(méi)有充分發(fā)揮Qtopia的可定制性,也增加了這些優(yōu)化方法的限制。
發(fā)明內(nèi)容
為了克服現(xiàn)有技術(shù)中的不足,本發(fā)明提供了一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法。
為了解決技術(shù)問(wèn)題,本發(fā)明是通過(guò)如下技術(shù)方案實(shí)現(xiàn)的。
一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法,包括以下步驟(1)分配內(nèi)存和釋放內(nèi)存的重載①分配內(nèi)存的重載在重載時(shí),函數(shù)提供的行為要和系統(tǒng)缺省的分配內(nèi)存操作一致,要有正確的返回值;可用內(nèi)存不夠時(shí)要調(diào)用出錯(cuò)處理函數(shù);處理好0字節(jié)內(nèi)存請(qǐng)求的情況;②釋放內(nèi)存的重載在出現(xiàn)要求釋放的是空地址的情況情況,不做任何操作,直接將NULL返回。
(2)預(yù)鏈接Qtopia共享鏈接庫(kù)為可執(zhí)行文件預(yù)鏈接共享鏈接庫(kù),將個(gè)人電腦平臺(tái)上的文件與Qtopia相關(guān)部分保留之后拷貝到嵌入式平臺(tái)上,作為標(biāo)準(zhǔn)查找路徑文件,之后采用目標(biāo)文件的命令進(jìn)行預(yù)鏈接;(3)減少可執(zhí)行文件規(guī)模減少可執(zhí)行文件規(guī)模,加快Qtopia圖形庫(kù)啟動(dòng)的速度,使用命令行命令目標(biāo)文件的方法實(shí)現(xiàn)。
作為一種改進(jìn),所述的返回值包括如果內(nèi)存分配請(qǐng)求成功,就返回指向內(nèi)存的指針;如果失敗,則拋出一個(gè)類(lèi)型異常。
作為一種改進(jìn),所述的重載分配內(nèi)存操作包括以下步驟(1)初始化操作定義一個(gè)新的指針,用來(lái)做開(kāi)辟內(nèi)存之后的指針;建立一個(gè)變量和分配內(nèi)存對(duì)應(yīng)的變量,判斷變量的值如果這個(gè)值是0,那么設(shè)置這個(gè)值為1,防止分配空地址,如果不是,直接進(jìn)入下一個(gè)階段;(2)開(kāi)辟內(nèi)存用alloc函數(shù)分配內(nèi)存,使用一個(gè)指針指向它;(3)判斷異常如果分配不成功,匯報(bào)異常,調(diào)用系統(tǒng)的分配內(nèi)存函數(shù),如果分配成功,返回上一步建立的指針。
作為一種改進(jìn),所述的重載釋放內(nèi)存操作是使用函數(shù)來(lái)重載釋放內(nèi)存操作,如果釋放內(nèi)存的指針不為空,使用函數(shù),如果為空,返回空。
與現(xiàn)有技術(shù)相比,本發(fā)明的有益效果是首先,效率高,通過(guò)去除兩個(gè)函數(shù)的通用性,提高了分配和釋放內(nèi)存空間時(shí)候的性能;其次,更新了動(dòng)態(tài)鏈接庫(kù),用預(yù)鏈接的方法鏈接所有的共享鏈接庫(kù),這樣可以在不削弱程序擴(kuò)展性的前提下,大幅度減少程序啟動(dòng)時(shí)花在重定位上的動(dòng)態(tài)鏈接時(shí)間;最后,使用專(zhuān)用的命令,減少可執(zhí)行文件的執(zhí)行規(guī)模,提高效率。
圖1是重載new函數(shù)的流程圖。
圖2是重載delete函數(shù)的流程圖。
具體實(shí)施例方式
下面結(jié)合附圖,通過(guò)具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明。
一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法,包括以下步驟(1)分配內(nèi)存(new)和釋放內(nèi)存(delete)的重載為了重載new/delete操作,本發(fā)明修改了/qt-2.3.9/src/qobject.cpp、qobject.h和qsignal.cpp、qsignal.h四個(gè)文件中的部分代碼。為了能重載的new/delete操作能為所有的Qtopia函數(shù)使用,本發(fā)明選擇了在qobject.h和qobiect.cpp中重載new/delete操作。QObject類(lèi)是所有Qt對(duì)象的基類(lèi),它被大多數(shù)的Qt庫(kù)類(lèi)所繼承,提供了一些Qt最基本的功能如定時(shí)器、對(duì)象管理等。而作為QObject的成員函數(shù)的new/delete操作也會(huì)被子類(lèi)繼承,同時(shí)可以屏蔽作為全局聲明的原new/delete操作。
①重載new操作首先,需要在qobject.h和qsignal.h中重載new操作的函數(shù)聲明為void*operator new(size_tsize);在重載時(shí),很重要的一點(diǎn)是函數(shù)提供的行為要和系統(tǒng)缺省的new操作一致,也就是要有正確的返回值;可用內(nèi)存不夠時(shí)要調(diào)用出錯(cuò)處理函數(shù);處理好0字節(jié)內(nèi)存請(qǐng)求的情況。
有關(guān)返回值的部分很簡(jiǎn)單。如果內(nèi)存分配請(qǐng)求成功,就返回指向內(nèi)存的指針;如果失敗,則拋出一個(gè)std::bad_alloc類(lèi)型的異常。但事情也不是那么簡(jiǎn)單。因?yàn)閚ew操作實(shí)際上會(huì)不只一次地嘗試著去分配內(nèi)存,它要在每次失敗后調(diào)用出錯(cuò)處理函數(shù),還期望出錯(cuò)處理函數(shù)能想辦法釋放別處的內(nèi)存,這將是一個(gè)循環(huán)的過(guò)程。這個(gè)循環(huán)只有在兩種情況會(huì)跳出一、在指向出錯(cuò)處理函數(shù)的指針為空的情況下,調(diào)用系統(tǒng)new操作并跳出循環(huán);二、內(nèi)存分配成功并跳出循環(huán)。
new操作默認(rèn)有六種重載形式,如下表所示。
本發(fā)明只重載了分配單塊內(nèi)存的第一種,原因首先,它是被調(diào)用最多的一個(gè);其次,其余5種重載形式,包括其他一些自定義的重載形式都會(huì)在本身的函數(shù)體內(nèi)部調(diào)用它。所以只要正確重載了void*operator new(std::size_t count),事實(shí)上就完成了其他new操作重載形式的重載工作。
根據(jù)以上分析,我就可以給出具體重載new操作算法如附圖1。
②重載delete操作重載delete操作的函數(shù)聲明為void operator delete(void*memoryToBeDeallocated);由于本發(fā)明使用malloc()重載了new操作,所以必須用free()來(lái)重載delete操作?;煊胣ew、free或者malloc、delete會(huì)帶來(lái)難以估量的風(fēng)險(xiǎn)。delete操作與delete3操作符的關(guān)系和new操作與new操作符的關(guān)系一樣。因此只能重載其中的delete操作。
與new操作類(lèi)似,delete也需要考慮到如果要求釋放的是空地址的情況。在出現(xiàn)這樣情況,可以不做任何操作,直接將NULL返回。
根據(jù)以上分析,本發(fā)明就給出具體重載delete操作流程如附圖2。
(2)預(yù)鏈接Qtopia共享鏈接庫(kù)
在本次實(shí)驗(yàn)中使用編譯器支持預(yù)鏈接,所以本文使用了編譯器自帶的prelink程序。本發(fā)明為distribution/lib和distribution/bin目錄下所有的可執(zhí)行文件預(yù)鏈接了共享鏈接庫(kù)。并且由于PC及目標(biāo)Intel XScale PXA 255采用的目錄結(jié)構(gòu)都是標(biāo)準(zhǔn)的Linux目錄結(jié)構(gòu),所以prelink.conf文件中指明的共享鏈接庫(kù)的位置并沒(méi)有發(fā)生變化。所以,可以將PC上的prelink.conf文件中與Qt相關(guān)部分保留之后拷貝到PXA 255上,作為標(biāo)準(zhǔn)prelink查找路徑文件。
預(yù)鏈接共享鏈接庫(kù)的命令行是prelink-s目標(biāo)文件。
(3)減少可執(zhí)行文件規(guī)模在本發(fā)明中,編譯器包含減少可執(zhí)行文件規(guī)模的命令,可以使用編譯器自帶的arm-linux-strip程序,對(duì)distribution目錄下所有的可執(zhí)行文件都執(zhí)行arm-linux-strip命令,就可以減少可執(zhí)行文件的規(guī)模。
命令行內(nèi)容是arm-linux-strip目標(biāo)文件。
為了檢驗(yàn)的新的畫(huà)圖函數(shù)的效果,使用修改過(guò)的QTopia圖形函數(shù)庫(kù)進(jìn)行實(shí)驗(yàn)。我們使用的目標(biāo)平臺(tái)是Intel XScale的開(kāi)發(fā)板,使用的操作系統(tǒng)是ARMLinux。本次實(shí)驗(yàn)所得的數(shù)據(jù)都是在這個(gè)平臺(tái)上獲得。
以下是我們的平臺(tái)詳細(xì)參數(shù)
首先分別進(jìn)行優(yōu)化,測(cè)試驗(yàn)數(shù)據(jù)。最后,綜合起來(lái)做。根據(jù)實(shí)現(xiàn)步驟,我們首先進(jìn)行重載new/delete的改動(dòng)。之后我們編譯,鏈接的時(shí)候采用預(yù)鏈接技術(shù)。最后,減少可執(zhí)行文件的規(guī)模。
分別進(jìn)行優(yōu)化,然后把3種優(yōu)化結(jié)合起來(lái)做,得到實(shí)驗(yàn)最終啟動(dòng)時(shí)間的對(duì)比,我們可以看到結(jié)果如下
我們可以看到,啟動(dòng)時(shí)間由顯著下降,時(shí)間性能顯著提升。
最后,還需要注意的是,以上列舉的僅是本發(fā)明的一個(gè)具體實(shí)施例。顯然,本發(fā)明不限于以上實(shí)施例,還可以有許多變形。本領(lǐng)域的普通技術(shù)人員能從本發(fā)明公開(kāi)的內(nèi)容直接導(dǎo)出或聯(lián)想到的所有變形,均應(yīng)認(rèn)為是本發(fā)明的保護(hù)范圍。
權(quán)利要求
1.一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法,其特征在于,包括以下步驟(1)分配內(nèi)存和釋放內(nèi)存的重載①分配內(nèi)存的重載在重載時(shí),函數(shù)提供的行為要和系統(tǒng)缺省的分配內(nèi)存操作一致,要有正確的返回值;可用內(nèi)存不夠時(shí)要調(diào)用出錯(cuò)處理函數(shù);處理好0字節(jié)內(nèi)存請(qǐng)求的情況;②釋放內(nèi)存的重載在出現(xiàn)要求釋放的是空地址的情況情況,不做任何操作,直接將NULL返回;(2)預(yù)鏈接Qtopia共享鏈接庫(kù)為可執(zhí)行文件預(yù)鏈接共享鏈接庫(kù),將個(gè)人電腦平臺(tái)上的文件與Qtopia相關(guān)部分保留之后拷貝到嵌入式平臺(tái)上,作為標(biāo)準(zhǔn)查找路徑文件,之后采用目標(biāo)文件的命令進(jìn)行預(yù)鏈接;(3)減少可執(zhí)行文件規(guī)模減少可執(zhí)行文件規(guī)模,加快Qtopia圖形庫(kù)啟動(dòng)的速度,使用命令行命令目標(biāo)文件的方法實(shí)現(xiàn)。
2.根據(jù)權(quán)利要求1所述的一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法,其特征在于,所述的返回值包括如果內(nèi)存分配請(qǐng)求成功,就返回指向內(nèi)存的指針;如果失敗,則拋出一個(gè)類(lèi)型異常。
3.根據(jù)權(quán)利要求1所述的一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法,其特征在于,所述的重載分配內(nèi)存操作包括以下步驟(1)初始化操作定義一個(gè)新的指針,用來(lái)做開(kāi)辟內(nèi)存之后的指針;建立一個(gè)變量和分配內(nèi)存對(duì)應(yīng)的變量,判斷變量的值如果這個(gè)值是0,那么設(shè)置這個(gè)值為1,防止分配空地址,如果不是,直接進(jìn)入下一個(gè)階段;(2)開(kāi)辟內(nèi)存用alloc函數(shù)分配內(nèi)存,使用一個(gè)指針指向它;(3)判斷異常如果分配不成功,匯報(bào)異常,調(diào)用系統(tǒng)的分配內(nèi)存函數(shù),如果分配成功,返回上一步建立的指針。
4.根據(jù)權(quán)利要求1所述的一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法,其特征在于,所述的重載釋放內(nèi)存操作是使用函數(shù)來(lái)重載釋放內(nèi)存操作,如果釋放內(nèi)存的指針不為空,使用函數(shù),如果為空,返回空。
全文摘要
本發(fā)明涉及嵌入式系統(tǒng),旨在提供一種嵌入式系統(tǒng)開(kāi)發(fā)平臺(tái)圖形庫(kù)的性能優(yōu)化設(shè)計(jì)方法。該方法包括以下步驟(1)重載分配內(nèi)存/釋放內(nèi)存操作;(2)預(yù)鏈接Qtopia共享鏈接庫(kù)為可執(zhí)行文件預(yù)鏈接共享鏈接庫(kù),將個(gè)人電腦平臺(tái)上的文件與Qtopia相關(guān)部分保留之后拷貝到嵌入式平臺(tái)上,作為標(biāo)準(zhǔn)查找路徑文件,之后采用目標(biāo)文件的命令進(jìn)行預(yù)鏈接;(3)減少可執(zhí)行文件規(guī)模。該發(fā)明通過(guò)去除兩個(gè)函數(shù)的通用性,提高了分配和釋放內(nèi)存空間時(shí)候的性能;更新了動(dòng)態(tài)鏈接庫(kù),用預(yù)鏈接的方法鏈接所有的共享鏈接庫(kù),在不削弱程序擴(kuò)展性的前提下,大幅度減少程序啟動(dòng)時(shí)花在重定位上的動(dòng)態(tài)鏈接時(shí)間;使用專(zhuān)用的命令,減少可執(zhí)行文件的執(zhí)行規(guī)模,提高效率。
文檔編號(hào)G06F9/44GK101013368SQ200710067160
公開(kāi)日2007年8月8日 申請(qǐng)日期2007年2月2日 優(yōu)先權(quán)日2007年2月2日
發(fā)明者陳天洲, 鄭臻煒, 黃江偉, 曹明騰 申請(qǐng)人:浙江大學(xué)