分配大量小型類對象(如:10,000小型記錄)最快和最佳方法是什么? 當(dāng)然,MFC 序列流化對象可以完成所需的任務(wù)。但是,內(nèi)存的分配和銷毀相當(dāng)耗時(shí)。有沒有辦法對此進(jìn)行改進(jìn)?
我無法告訴你最好的方法,因?yàn)槟侨Q與應(yīng)用程序的具體情況和其使用方式。性能和內(nèi)存分配是如此巨大的一個(gè)主題,有關(guān)它們已經(jīng)有很多很多書籍。沒有哪一種方案適合所有的情形。最優(yōu)化總是需要在速度和其它資源之間進(jìn)行明智的權(quán)衡。例如,如果你愿意建立巨型索引,那么就會獲得非?斓牟樵兯俣。或者要想顯示速度快,那么就得以加載時(shí)間作為代價(jià)。因此,我只能就某些需要考慮的問題給你提供一個(gè)概述,以及提供一些工具和途徑以幫助你自己找到答案。
如果你覺得程序的性能不太滿意,首先必須確定瓶頸在哪,對此要有清醒的認(rèn)識。你可以借助復(fù)雜的工具(profiler)來產(chǎn)生各種有關(guān)性能的報(bào)告,但如果只是想知道你的代碼在哪里耗時(shí),那么用一些自己編寫的簡單工具即可,我寫了一個(gè)類叫 ShowTime,它可以報(bào)告代碼的某些部分執(zhí)行時(shí)要花費(fèi)多長時(shí)間。為了使用它,你只需在要用時(shí)鐘的代碼塊起始處實(shí)例化一個(gè) ShowTime 堆棧對象即可:
void CalculatePi(){ ShowTime st("Calculating pi"); // do it}
這段代碼將產(chǎn)生一個(gè)象下面這樣的 TRACE 信息:
Calculating pi: 342 msec
ShowTime 是如何工作的呢?它為智能指針以及在代碼塊起始處和末尾處你想做某些自動處理的地方使用常見的 C++ 構(gòu)造函數(shù)/析構(gòu)函數(shù)(ctor/dtor)模式。ShowTime 的構(gòu)造函數(shù)將時(shí)鐘時(shí)間(自從進(jìn)程啟動后的時(shí)鐘嘀嗒數(shù))保存在某個(gè)數(shù)據(jù)成員中;析構(gòu)函數(shù)則用從最后的時(shí)鐘數(shù)中減去這個(gè)時(shí)鐘數(shù)并產(chǎn)生一條信息。由于構(gòu)造函數(shù)/析構(gòu)函數(shù)是在代碼塊的起始處/末尾處調(diào)用的,這樣便測算出總共用了多少時(shí)間。代碼如 Figure 1 所示。
ShowTime 并不太復(fù)雜。比如,它并不考慮多線程的情況,并且也不報(bào)告在每個(gè)函數(shù)中某個(gè)工具消耗了多少時(shí)間。但是對于日常使用來說,它能給你提供應(yīng)用程序在何處耗時(shí)的很好的參考。不要忘記針對 Release 版本進(jìn)行性能測試!畢竟那是你交付使用的版本。此外,Release 和 Debug 版本之間的差別可能會曲解你的結(jié)果。例如,依賴你的設(shè)置方式,debug 版本也許要進(jìn)行額外的堆棧,這樣便使應(yīng)用程序性能下降。由于在 Release 版本中沒有 TRACE 信息,所以我添加了另外一個(gè)類,PerfLog,它可以將性能統(tǒng)計(jì)定向到一個(gè)文件:
// open log filePerfLog mylog("MyResults.log");轉(zhuǎn)帖于:軟件水平考試_考試吧
版權(quán)聲明 --------------------------------------------------------------------------------------
如果
軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系

,我們將會及時(shí)處理。如轉(zhuǎn)載本
軟件水平考試網(wǎng)內(nèi)容,請注明出處。