国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

Delphi與匯編雜談(2)

2019-11-18 18:30:02
字體:
供稿:網(wǎng)友
 

                                                                                                                初級(jí)優(yōu)化篇

說到優(yōu)化,很多人又不屑一顧了,“現(xiàn)在計(jì)算機(jī)速度都那么快了,再快那么百分之幾有什么意義啊”。這么說確實(shí)有些道理,現(xiàn)在的編譯器編譯后的結(jié)果已經(jīng)是充分優(yōu)化過了,除了圖形圖像多媒體等特定軟件的開發(fā)外、多數(shù)情況下刻意的優(yōu)化確實(shí)沒必要,但是如果開發(fā)人員在編寫代碼的時(shí)候已經(jīng)具有了優(yōu)化意識(shí),在完成優(yōu)化的同時(shí),又能保證了甚至提升開發(fā)效率,何樂而不為呢?

當(dāng)然,算法的設(shè)計(jì)都是優(yōu)化的核心,絕大多數(shù)情況下,程序的執(zhí)行效率高低主要由開發(fā)人員對程序整體把握,算法的設(shè)計(jì)等來決定!但有時(shí)候針對細(xì)節(jié)的優(yōu)化也是有一定意義的!

而且這種優(yōu)化在很多情況下也并不需要直接通過匯編來寫代碼實(shí)現(xiàn),但這種情況下卻也能體現(xiàn)出掌握匯編知識(shí)的優(yōu)越性!

如下面兩個(gè)函數(shù):

function GetBit(i: Cardinal; n: Cardinal): Boolean;
begin
  Result := Boolean((i shr n) and 1);
end;

function GetBit(i: Cardinal; n: Cardinal): Boolean;
begin
  Result := Boolean((1 shl n) and i);
end;

對應(yīng)的匯編代碼:

MOV ECX, EDX
SHR EAX, CL
AND EAX, $01

MOV ECX, EDX
MOV EDX, $01
SHL EDX, CL
AND EAX, EDX

它們的作用一樣,都是取i某位的值,為1返回True,0返回False!

表面上看可能都會(huì)認(rèn)為兩個(gè)函數(shù)的執(zhí)行效率一樣,實(shí)際上還是有區(qū)別的,第一段程序是的移位操作是對i進(jìn)行的,按照Delphi中默認(rèn)的調(diào)用約定register,此時(shí)的i的值是存在寄存器EAX中,移位操作可直接完成;而第二段程序則不同,要對立即數(shù)1完成移位操作,必須先將其傳送到寄存器,由此也就必然多出一條指令!當(dāng)然也不是所有情況下,指令少就一定比指令多要快,具體執(zhí)行時(shí)還要考慮指令執(zhí)行的時(shí)鐘周期和指令的配對等問題(后面再介紹些),獨(dú)立出來也說明不了問題,只有在具體代碼環(huán)境中才好作比較。

一般情況下這種效率上的執(zhí)行差異實(shí)在是太微不足道了,但在編程期間時(shí)刻保持著優(yōu)化的意識(shí)絕不是件壞事!如果此類代碼位于循環(huán)的最里層,N個(gè)時(shí)鐘周期經(jīng)過大量循環(huán)的累積,產(chǎn)生的執(zhí)行效率差異也可能變的很大!

上面只是個(gè)很小的例子,由此可以看出在開發(fā)中如果能站在匯編的角度思考一些問題,能在保證開發(fā)效率的同時(shí)用高級(jí)語言編寫出更有效率的細(xì)節(jié)代碼!但還有很多時(shí)候,細(xì)節(jié)優(yōu)化還要用使用嵌入?yún)R編代碼來完成,而且有些時(shí)候由于嵌入?yún)R編代碼應(yīng)用,還能使代碼編寫變得更有效率。

如需要將一個(gè)32位數(shù)的字節(jié)順序顛倒,在Delphi中,完全用高級(jí)語言實(shí)現(xiàn)怎么做?用移位可以,多次調(diào)用內(nèi)建函數(shù)Swap也可以,但是如果想到一條BSWAP指令,這一切變得很簡單。

function SwapLong(Value: Cardinal): Cardinal;
asm
  BSWAP EAX
end;

注:同上,Value的值是存在寄存器EAX中,而32位數(shù)的值也通過EAX返回,所以只需要一句即可。

當(dāng)然多數(shù)的嵌入?yún)R編優(yōu)化沒有這么簡單,不過通過大學(xué)里所學(xué)的那一點(diǎn)點(diǎn)匯編知識(shí)也很難做到更深入的優(yōu)化,也只能通過不斷的積累,對比編譯后的匯編代碼獲取經(jīng)驗(yàn)!好在多數(shù)情況下,細(xì)節(jié)優(yōu)化并不是程序設(shè)計(jì)的主體。

但如果所開發(fā)程序涉及到圖形圖像多媒體等方面,還是有必要進(jìn)行更深入的優(yōu)化的!好在不管是浮點(diǎn)指令的優(yōu)化還是應(yīng)用MMX、SSE、3DNow等完成優(yōu)化,Delphi6都能提供良好的支持。即使是想早期版本的Delphi支持這些CPU擴(kuò)展指令集或者想要支持以后新的CPU指令集,利用Delphi在嵌入?yún)R編中所支持的DB、DW、DD、DQ等四條匯編指令(在Borland的Delphi6官方語言手冊里只說支持DB、DW、DD)插入相關(guān)指令的數(shù)值表示也能靈活的實(shí)現(xiàn)。

如:

DW $A20F //CPUID

DW $770F //EMMS
DB $0F, $6F, $C1 //MOVQ MM0, MM1

了解指令只是基礎(chǔ),在圍繞FPU,MMX,SSE設(shè)計(jì)完算法后,想更深一步的進(jìn)行優(yōu)化,還必須了解一些CPU本身的技術(shù)特性。

先看看下面兩段代碼:

asm
  ADD [a], ECX
  ADD [b], EDX
end

asm
  MOV EAX, [a]
  MOV EBX, [b]
  ADD EAX, ECX
  ADD EBX, EDX
  MOV [a], EAX
  MOV [b], EBX
end

第二個(gè)效率高?錯(cuò)了,如上面說的,指令少不意味著執(zhí)行效率高,查查相關(guān)資料可知,第一段代碼的兩條指令執(zhí)行的時(shí)鐘周期為3(每條指令都需要完成讀、改、寫三步),第二段代碼中的6條指令執(zhí)行的時(shí)鐘周期都為1。那么說兩段代碼效率一樣?又錯(cuò)了,實(shí)際上第二段代碼執(zhí)行效率比第一段代碼要高!為什么?因?yàn)楸简v級(jí)以后的CPU都有兩條流水線來執(zhí)行指令,所以當(dāng)相鄰的兩條指令能夠完成配對,那么它們就能夠同時(shí)執(zhí)行!具體到上面的兩段代碼來說具體原因又是什么呢?

第一段代碼中的兩條指令雖然可以完成配對,但需要的總執(zhí)行時(shí)鐘周期為5而不是3,而第二段代碼的六條指令可以兩兩之間并行執(zhí)行,所以也就導(dǎo)致了這個(gè)結(jié)果。

說到這里,都是些很淺顯的例子,本身給不了大家太多的幫助。如果真的想優(yōu)化特定程序,還是找些FPU,MMX優(yōu)化的專題文章看看,或者找來技術(shù)手冊好好專研專研“亂序執(zhí)行”和“分枝預(yù)測”等技術(shù)。只希望各位在上大學(xué)的朋友們不要只專注于那些“能賺錢”的開發(fā)工具和時(shí)髦的新技術(shù),能把更多的時(shí)間花在打基礎(chǔ)上,有了扎實(shí)的基礎(chǔ)才能快速掌握新知識(shí)、才能用更快的時(shí)間掌握新的開發(fā)工具、才能...(省略一千字)。

不過話又說回來,知識(shí)還是要用來解決實(shí)際問題的,如果每天就只在技術(shù)細(xì)節(jié)上做文章,也許能成為一個(gè)出色的黑客,但絕對開發(fā)不出一流的軟件。所以還是要以創(chuàng)造價(jià)值為根本目的。所以...不說了,再說下去就真不像技術(shù)文章了。^_^

附:程序優(yōu)化除了考慮執(zhí)行效率以外,當(dāng)然也要考慮體積的問題(體積小才能更快的載入內(nèi)存,更快的完成指令譯碼等工作),比如清空EAX寄存器都是用SUB EAX, EAX或XOR EAX, EAX而不會(huì)用MOV EAX, $0,雖然它們的執(zhí)行時(shí)鐘周期都是1,但前者的指令長度(2字節(jié))明顯比后者(5字節(jié))短。但因?yàn)樯厦嬲f的都是些細(xì)節(jié),所以沒提到體積的問題。更多的縮小體積的問題還是交給編譯器去解決吧,在編寫嵌入ASM代碼的同時(shí)稍微注意一下就可以了。


上一篇:用DELPHI開發(fā)自動(dòng)化服器

下一篇:用DELPHI開發(fā)DirectX游戲

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 鄂托克旗| 武宁县| 凉山| 宁都县| 瓮安县| 博兴县| 澄江县| 涡阳县| 石门县| 万全县| 永寿县| 新丰县| 绥滨县| 永定县| 自贡市| 龙江县| 威海市| 敦化市| 海晏县| 闽清县| 衡阳县| 波密县| 台湾省| 外汇| 新巴尔虎左旗| 孟连| 咸阳市| 广东省| 新安县| 资溪县| 宽城| 泸水县| 玉山县| 临洮县| 青州市| 钟山县| 措勤县| 鹤庆县| 福安市| 墨江| 新源县|