昝道廣 梁肖裕 劉忠青 徐西彤 李晨輝 山東科技大學(xué)電氣信息系
隨著計(jì)算機(jī)硬件的不斷更新升級(jí),其內(nèi)存因素對(duì)于計(jì)算機(jī)硬件的影響越來(lái)越小,已經(jīng)不能限制程序計(jì)算的完善。應(yīng)用程序在計(jì)算機(jī)占有空間越來(lái)越富裕,程序在使用中不再首要考慮內(nèi)存因素。但是程序設(shè)計(jì)的時(shí)間性能在很多應(yīng)用場(chǎng)合依然發(fā)揮重要價(jià)值,例如實(shí)時(shí)嵌入式系統(tǒng)、需要處理大量的信息數(shù)據(jù)情景和對(duì)程序運(yùn)行速度要求高的情景等等。
C++語(yǔ)言是一種能夠同時(shí)支持多種編程語(yǔ)言的編程語(yǔ)言集合。在具體程序設(shè)計(jì)過(guò)程中,為發(fā)揮其功能的靈活性,未在編譯器生成的程序中顯現(xiàn)出相應(yīng)的數(shù)據(jù)結(jié)構(gòu)和代碼。程序設(shè)計(jì)人員無(wú)法在載體上看到數(shù)據(jù)結(jié)構(gòu)和代碼,只有憑借自身積累的實(shí)踐經(jīng)驗(yàn),軟件工程師才會(huì)全面系統(tǒng)了解編譯器自動(dòng)生成的代碼時(shí)機(jī)和條件,因此很難把握C++程序的時(shí)間性能和空間性能。C++是在C語(yǔ)言的基礎(chǔ)上演化而來(lái),它具有C語(yǔ)言的應(yīng)用優(yōu)勢(shì),同時(shí)彌補(bǔ)了C語(yǔ)言的缺陷,很多C語(yǔ)言不能支撐的軟件開(kāi)發(fā)、系統(tǒng)開(kāi)發(fā)和引擎開(kāi)發(fā),都可以使用C++。現(xiàn)階段,計(jì)算機(jī)硬件的運(yùn)行速度越來(lái)越快,設(shè)計(jì)內(nèi)存空間也越來(lái)越大,需要引起注意的是對(duì)時(shí)間性能的優(yōu)化方面,還需要進(jìn)一步在程序設(shè)計(jì)中加以?xún)?yōu)化改進(jìn)。
Inline函數(shù)在程序編譯過(guò)程中,由調(diào)用指令轉(zhuǎn)變?yōu)楹瘮?shù)體代碼,即在編譯后的可執(zhí)行文件中,將原本需要調(diào)用函數(shù)的場(chǎng)合,更改為該函數(shù)的代碼,直接減少了函數(shù)調(diào)用過(guò)程中的進(jìn)棧和出棧操作步驟,因此提升了程序運(yùn)行中的時(shí)間性能。以下為通過(guò)合理使用inline來(lái)優(yōu)化時(shí)間性能的分析。直接在調(diào)用處插入函數(shù)代碼,使得程序編譯對(duì)代碼上下文信息有更加深入的了解,發(fā)揮出這些信息的支持作用,幫助人們利用編譯器來(lái)優(yōu)化代碼,但是我們并不詳細(xì)了解優(yōu)化流程和優(yōu)化內(nèi)容。如果不使用inline程序執(zhí)行到函數(shù)調(diào)用位置,需要具體執(zhí)行函數(shù)體所在地方的代碼。一般函數(shù)調(diào)用位置和函數(shù)代碼所在地方并不接近,容易造成操作系統(tǒng)的缺頁(yè)中斷,而在要求操作系統(tǒng)將缺頁(yè)位置處的代碼移植到硬盤(pán)內(nèi)存時(shí),需要消耗的時(shí)間就會(huì)呈現(xiàn)數(shù)量級(jí)增加情況,但是在使用inline的情況下就會(huì)降低缺頁(yè)中斷的發(fā)生率。
C++語(yǔ)言是從C語(yǔ)言的基礎(chǔ)上發(fā)展和演化而來(lái)的程序設(shè)計(jì)語(yǔ)言,C++語(yǔ)言具有鮮明的特性和典型特征,例如虛函數(shù)和C++的虛函數(shù)都是多態(tài)場(chǎng)合下運(yùn)行,實(shí)現(xiàn)了很多程序設(shè)計(jì)的優(yōu)化和升級(jí),創(chuàng)新出這種功能的新用法,但是并非完全都是優(yōu)勢(shì)而不存在缺陷,由于虛函數(shù)的使用會(huì)加強(qiáng)更大空間壓力和時(shí)間壓力,降低了程序的空間性能和時(shí)間性能。因此在具體程序設(shè)計(jì)和運(yùn)行過(guò)程中,特定的虛函數(shù)類(lèi)對(duì)應(yīng)特定的虛函數(shù)表,函數(shù)表上主要保存的是函數(shù)指針,每次對(duì)虛函數(shù)進(jìn)行實(shí)例化操作后就增加相應(yīng)的虛函數(shù)表數(shù)量,這一過(guò)程耗費(fèi)一定量的時(shí)間和空間。謹(jǐn)慎使用虛函數(shù),減少降低程序時(shí)間性能的機(jī)會(huì),考慮其它辦法以此保障程序設(shè)計(jì)中的時(shí)間性能。
C++程序中經(jīng)常使用到指針類(lèi)型。如果能夠在適當(dāng)場(chǎng)合下合理使用指針,不僅可以節(jié)省大量?jī)?nèi)存,而且還有助于節(jié)省運(yùn)行時(shí)間。例如,如果需要將眾多復(fù)雜的信息保存在程序內(nèi)部,我們需要將一個(gè)信息單元保存在單項(xiàng)種類(lèi)中,然后對(duì)這種類(lèi)型的對(duì)象保存在特定的某種STL容器內(nèi)部。如果是直接保存對(duì)象,一方面會(huì)讓單項(xiàng)個(gè)體信息存儲(chǔ)在多個(gè)對(duì)象中,浪費(fèi)了大量的內(nèi)存空間;另一方面選擇對(duì)象無(wú)論是從容器中存人或者是取出都需要大量的運(yùn)行時(shí)間。但是如果將指針作為存儲(chǔ)對(duì)象,那么對(duì)應(yīng)的信息單元僅僅需要個(gè)體對(duì)象保存完成,并且指針從容器中存入和取出的時(shí)間性能效率更高。但是由于指針容易導(dǎo)致內(nèi)存泄露,不方便軟件設(shè)計(jì)。因此軟件工程師必須明確控制指針在特定的時(shí)間內(nèi)被釋放,如果沒(méi)有將泄露內(nèi)存,并且對(duì)程序產(chǎn)生異常。
綜上所述,時(shí)間性能優(yōu)化是C++程序設(shè)計(jì)中保證開(kāi)發(fā)質(zhì)量的必然要求,同時(shí)也是衡量的重要指標(biāo)。在空間性能已經(jīng)不再成為限制性因素的情況下,軟件設(shè)計(jì)的更多精力應(yīng)該集中于程序時(shí)間性能優(yōu)化方面。本文主要對(duì)C++程序設(shè)計(jì)中的時(shí)間優(yōu)化方法做出分析,在具體程序設(shè)計(jì)中,還可以利用改進(jìn)數(shù)據(jù)結(jié)構(gòu)和算法措施,來(lái)對(duì)時(shí)間性能加以?xún)?yōu)化。