付費(fèi)下載
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
論反匯編在時(shí)間常數(shù)優(yōu)化中的應(yīng)省七 :VisualC++語言環(huán)境下,從特定編譯器關(guān)鍵字:C++反匯編時(shí)間常數(shù)優(yōu)化VisualC++語言環(huán)境下,從特定編譯器生成的匯編代碼出發(fā),探一、基本概language由于匯編語言的各種語范互不兼容,本文以下部分以In語法為基礎(chǔ),并以使用In語法的VisualC++作為實(shí)驗(yàn)平臺(tái)。addaddeax,add有兩個(gè)參數(shù)。一個(gè)源參數(shù),一個(gè)目標(biāo)參數(shù)。它把源值加到目標(biāo)值中,有幾種大小的寄存器:4位,8位,16位,32位(MMX處理器中有更多的種類。在16位程序中,你僅能使用4位、8位和16位的寄存器。在32eax保存了值EA7823BBh,那么,它的子寄存器ax,ah和al也會(huì)保存其值的一部分,如下表所示: EA782323ax,ah,aleax的一部分。eax32位的寄存器(386以上存在)ax包含eax16位(2字節(jié),ahax的高字節(jié),而al包含了ax的低位字節(jié)。因而ax16位的,alax8位的。讓來分析下面的代碼eax,cl,cl,10al,clmov指令可以把一個(gè)值從寄存器,內(nèi)存或直接數(shù)值移入另一個(gè)寄存器。在上面的例子中,eax12345678hah的值(eax左數(shù)第三個(gè)字節(jié))被cl中(ecx寄存器的最低字節(jié)。然后,cl10al中(eax的編譯器(Compiler),是將便于人編寫,閱讀,的高級(jí)計(jì)算機(jī)語言程序program)作為輸入,翻譯產(chǎn)生使用目標(biāo)語言(language)的等價(jià)程序。language而目標(biāo)程序則是機(jī)器能直接執(zhí)行的目標(biāo)代碼(Objectcode碼(Machinecode。r功能的完整性不依賴于特定編譯器的特性或隱藏功能,因此具有通用性和兼容二、數(shù)據(jù)分1Aoa[1]8286系統(tǒng)各種偽代碼的理論執(zhí)行時(shí)間表表1:8286指令集的執(zhí)試驗(yàn)環(huán)試驗(yàn)環(huán)境 WindowsXPsp2050301-1519MSVC++69514-335-0000007-硬件:InPentium4CPU2.66GHzRelease模式等同于優(yōu)化模式約等于G++中-O2優(yōu)化進(jìn)試。#include<time.h>#include#include<time.h>#include<stdio.h>clock_tstart,finish;inta;{movecx,2000000000 moveax,10movebx,10 dececxjztestEndjmp}return0;}的Python,得出了表2的結(jié)果:表2:在測(cè)試環(huán)境下各個(gè)指令實(shí)際運(yùn)行時(shí)間及比NORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALNORMALPTRPTRPTRPTRPTRPTRPUSHCALLRET注1有誤差,并且會(huì)隨著操作系 編譯器和系統(tǒng)配置的變化而不同程度的波動(dòng)具體測(cè)試語句見附錄L1L2變量長度(16,32)等3表311andorxornotadd,sub加減法運(yùn)算,test置位運(yùn)算(為sub運(yùn)算2344556call+ret調(diào)用子函數(shù)+從這6個(gè)層次中,可以看到匯編代碼執(zhí)行的快慢程度,因此,如果我作組合,那么,就達(dá)到了對(duì)時(shí)間常數(shù)進(jìn)行優(yōu)化的目的。三、實(shí)例分memset函數(shù)的小實(shí)看下面的C++程序(假設(shè)計(jì)算機(jī)具有足夠大的內(nèi)存:#include#includeconstintcharfield[Total/Time];intforforfor(i=0;i<Time;i++)return}Time值對(duì)速度無影響,因?yàn)槌绦虻臅r(shí)間復(fù)雜度守恒。但是,當(dāng)上機(jī)實(shí)驗(yàn)后,你會(huì)發(fā)現(xiàn)Time100000左右時(shí)程序運(yùn)行最快Time值在C++語言中,把memset作為一個(gè)函數(shù)進(jìn)行調(diào)用。但其實(shí),系統(tǒng)中有專門的匯編偽代碼實(shí)現(xiàn)相同的工作(repstos)Release模式下,編譯器對(duì)memset進(jìn)行了優(yōu)化,編譯為如下所示的匯編代碼:edi,offsettablerepdwordptr編譯器對(duì)memset過程處理如下:0offsetfieldRelease的實(shí)現(xiàn)效率不同這個(gè)現(xiàn)象,可以發(fā)現(xiàn),對(duì)程序進(jìn)行優(yōu)化是可能的。Debug004133AD004133B0004133B1004133B4004133B5swap004133AD004133B0004133B1004133B4004133B5swap測(cè)試調(diào)用的函測(cè)試調(diào)用的函 :inlinevoidswap(int&a,int&b){int 004133BA 0041157D _aligned_free_dbg00411582 00411587 GetStringTypeW0041158C swap00411591 00411592 call+ret語句而變大了。不僅如此,微軟Debug模式下會(huì)在內(nèi)存中創(chuàng)建跳轉(zhuǎn)表,可以稍加想象。比如編譯器對(duì)stl庫函數(shù)的實(shí)現(xiàn)。stl庫函數(shù)的C++代碼層的迭代(stl庫函數(shù)的調(diào)用時(shí)可以很直觀的理解這一點(diǎn)。所以,在的程序中,應(yīng)該針對(duì)這個(gè)問題進(jìn)行優(yōu)化。這里,我提供了兩種替然不在define塊中定義變量(很可能會(huì)遇到難以估計(jì)的問題但是用全局變量可以解決同樣的問題。如下例就巧妙地解決了swap的臨時(shí)變量問題。intintintmain(){return0;}#include<stdio.h>#include<stdlib.h>intgetRand(){intreturn_t;}#definemax(A,B)int{printf("Getthemaxvalue:%d\n",max(getRand(),getRand()));return0;}運(yùn)行結(jié)果(恒定CallgetRandreturn4461CallgetRandreturn3994Getthemaxvalue:3994ReleaseDebug模式不同的是,在Release0040105B0040105Ereturn0;00401062dwordptr測(cè)試void int 除法(求余)求余運(yùn)算c=a%b等效于c=a-a/b但是,其實(shí)現(xiàn)直接使用除法的第eax,dwordptreax,dwordptrdwordptridiv是一種比例時(shí)間很大的指令。編譯器a/=2(a32位整數(shù))Debug模式下的解釋:eax,dwordptrdwordptr接可用位運(yùn)算代替,使用位運(yùn)算。法判斷變量的特殊性,以至于編譯器直接將語句翻譯為idiv操作。這樣,如果constconst關(guān)于數(shù)組的性能優(yōu))數(shù)組數(shù)組中的數(shù)據(jù)。若要數(shù)組中的單個(gè)元素,可以使用后面跟數(shù)組索引(數(shù)組索引放在方括號(hào)([])中)的數(shù)組標(biāo)識(shí)符。若要整個(gè)數(shù)組,則只需)00411B6Fmov00411B7500411B7800411B7F00411B85eax,dwordptr[i]00411B6Fmov00411B7500411B7800411B7F00411B85eax,dwordptr[i]edx,dwordptr[j]eax,dwordptrreturn0040102E eax,dwordptr00401032 00401035 eax,dwordptr00401039 0040103C 0040103F eax,dwordptrN,那么用type*指針加減操作以及輔助記錄要更快一些(省去了乘法操作。下面是實(shí)00411B5500411B5A00411B5D00411B6300411B6A
ecx,dwordptr[jdwordptr[a(42B6A0h)],edxeax,dwordptr[ddecx,dwordptrdwordptr[beax,dwordptr[goecx,dwordptr[ptrdwordptr[ptr200411A60mov00411A65eax,dwordptr[ptr2eax,00411A60mov00411A65eax,dwordptr[ptr2eax,dwordptr例:adv1900題意描述數(shù)據(jù)規(guī)模100%的數(shù)據(jù)中,1≤N,M≤200,時(shí)間片段個(gè)數(shù)(K)≤200,時(shí)間長度RMQ等,也是基于“批處理”化的思想。但是,在有了上文的實(shí)驗(yàn)結(jié)論后,我表3:“行走”表4:非“行走”優(yōu)化方試題:adv1900試題:adv1900評(píng)測(cè)結(jié)果 時(shí) 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 正 雖然和標(biāo)準(zhǔn)方法的速度(0.3s)有很大差距,但是,使用這種方法,能夠四、總匯編語言,是最接近于計(jì)算機(jī)本質(zhì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 衛(wèi)生院藥品收費(fèi)制度
- 衛(wèi)生監(jiān)督人事管理制度
- 衛(wèi)生院基礎(chǔ)績(jī)效獎(jiǎng)金制度
- 衛(wèi)生站發(fā)熱病人轉(zhuǎn)診制度
- 鄉(xiāng)鎮(zhèn)衛(wèi)生院醫(yī)保工作制度
- xx衛(wèi)生院雙向轉(zhuǎn)診制度
- 小科局衛(wèi)生考核制度
- 醫(yī)療衛(wèi)生機(jī)構(gòu)內(nèi)控制度
- 衛(wèi)生院術(shù)前討論制度
- 農(nóng)藥店衛(wèi)生安全管理制度
- UL498標(biāo)準(zhǔn)中文版-2019插頭插座UL標(biāo)準(zhǔn)中文版
- 《非物質(zhì)文化遺產(chǎn)》課程教學(xué)大綱
- 小學(xué)英語名師工作室工作總結(jié)
- 2024年中考數(shù)學(xué)復(fù)習(xí):瓜豆原理講解練習(xí)
- 高一歷史期末試題中國近現(xiàn)代史
- (高清版)DZT 0210-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 硫鐵礦
- 居民自建樁安裝告知書回執(zhí)
- QC080000體系內(nèi)部審核檢查表
- 初中語文仿寫訓(xùn)練
- 延遲焦化裝置(改)
- GB 12327-2022海道測(cè)量規(guī)范
評(píng)論
0/150
提交評(píng)論