亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi與匯編雜談(2)

2019-11-18 18:30:02
字體:
來源:轉載
供稿:網友
 

                                                                                                                初級優化篇

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

當然,算法的設計都是優化的核心,絕大多數情況下,程序的執行效率高低主要由開發人員對程序整體把握,算法的設計等來決定!但有時候針對細節的優化也是有一定意義的!

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

如下面兩個函數:

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;

對應的匯編代碼:

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!

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

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

上面只是個很小的例子,由此可以看出在開發中如果能站在匯編的角度思考一些問題,能在保證開發效率的同時用高級語言編寫出更有效率的細節代碼!但還有很多時候,細節優化還要用使用嵌入匯編代碼來完成,而且有些時候由于嵌入匯編代碼應用,還能使代碼編寫變得更有效率。

如需要將一個32位數的字節順序顛倒,在Delphi中,完全用高級語言實現怎么做?用移位可以,多次調用內建函數Swap也可以,但是如果想到一條BSWAP指令,這一切變得很簡單。

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

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

當然多數的嵌入匯編優化沒有這么簡單,不過通過大學里所學的那一點點匯編知識也很難做到更深入的優化,也只能通過不斷的積累,對比編譯后的匯編代碼獲取經驗!好在多數情況下,細節優化并不是程序設計的主體。

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

如:

DW $A20F //CPUID

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

了解指令只是基礎,在圍繞FPU,MMX,SSE設計完算法后,想更深一步的進行優化,還必須了解一些CPU本身的技術特性。

先看看下面兩段代碼:

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

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

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

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

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

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


上一篇:用DELPHI開發自動化服器

下一篇:用DELPHI開發DirectX游戲

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最好看的2019年中文视频| 久久99精品久久久久久青青91| 精品久久久久久中文字幕一区奶水| 日韩精品小视频| 69久久夜色精品国产7777| 91精品在线观| 欧洲亚洲在线视频| 久久久久久久久爱| 亚洲欧美日韩精品久久| 在线视频日本亚洲性| 欧美极品少妇xxxxⅹ免费视频| 久久久91精品国产一区不卡| 久久久精品2019中文字幕神马| 日韩av影院在线观看| 国产视频亚洲视频| 国产精品人人做人人爽| 欧美影院成年免费版| 色综合伊人色综合网站| 日韩69视频在线观看| 欧美在线播放视频| 久久人体大胆视频| 日韩视频中文字幕| 午夜美女久久久久爽久久| 中文字幕综合一区| 亚洲va男人天堂| 秋霞成人午夜鲁丝一区二区三区| 一本久久综合亚洲鲁鲁| 国产精品www色诱视频| 欧美大片免费看| 国产香蕉97碰碰久久人人| 久久福利视频网| 亚洲视频专区在线| 91欧美激情另类亚洲| 亚洲影院高清在线| 中文日韩电影网站| 欧美成人小视频| 精品调教chinesegay| 亚洲精品suv精品一区二区| 久久久久久久久中文字幕| 欧美日韩免费区域视频在线观看| 夜夜躁日日躁狠狠久久88av| 亚洲精品日韩欧美| 欧美高清第一页| 亚洲va欧美va国产综合久久| 国产成人久久精品| 日本久久久久亚洲中字幕| 欧美电影免费观看大全| 91久久精品美女| 亚洲国产精品热久久| 日韩精品久久久久久久玫瑰园| 日本中文字幕久久看| 欧美一级视频免费在线观看| 国产99久久精品一区二区| 久久久这里只有精品视频| 国产亚洲欧洲黄色| 国产高清在线不卡| 国产免费一区视频观看免费| 日韩欧美国产黄色| 中文字幕日韩av| 久久躁日日躁aaaaxxxx| 88国产精品欧美一区二区三区| 日韩欧美国产高清91| 国产精品欧美激情在线播放| 欧美日韩在线免费| 国产精品视频久久久| 91av视频在线免费观看| 性夜试看影院91社区| 美日韩丰满少妇在线观看| 国产精品一区二区三区成人| 日韩av三级在线观看| 亚洲精品免费一区二区三区| 91中文精品字幕在线视频| 欧美大秀在线观看| 欧美性受xxxx黑人猛交| 久久亚洲精品小早川怜子66| 91av在线看| 国产精品偷伦免费视频观看的| 国产欧美中文字幕| 欧美激情一级欧美精品| 亚洲精品国精品久久99热| 日韩在线播放一区| 成人在线一区二区| 精品久久久国产| 在线播放国产一区中文字幕剧情欧美| 国产欧美日韩免费| 欧美日韩xxxxx| 日本高清视频一区| 亚洲国产精品成人一区二区| 国产999精品久久久| 国产精品福利网站| 欧美日韩电影在线观看| 国产精品成人aaaaa网站| 欧美日韩一区二区免费在线观看| 国产综合香蕉五月婷在线| 欧美理论片在线观看| 97视频免费看| 久久免费精品视频| 亚洲精品720p| 国产精品久久久久久久天堂| 日韩网站免费观看高清| 91老司机在线| 这里只有精品视频在线| 久久久中精品2020中文| 26uuu另类亚洲欧美日本一| 亚洲高清不卡av| 欧美多人爱爱视频网站| 亚洲一区二区免费在线| 欧美在线视频a| 日韩有码在线电影| 国产精品wwwwww| 性视频1819p久久| 在线免费观看羞羞视频一区二区| 色综合久久88色综合天天看泰| 高跟丝袜欧美一区| 国产精品久久久av久久久| 68精品国产免费久久久久久婷婷| 日韩中文字幕av| 日本久久亚洲电影| 在线观看成人黄色| 亚洲国产中文字幕久久网| 久久久久久九九九| 日韩免费高清在线观看| 国产精品高精视频免费| 色综合导航网站| 亚洲tv在线观看| 国产精品人成电影在线观看| 久久精品国产一区二区电影| 亚洲日本中文字幕免费在线不卡| 国产精品久久久久久久天堂| 亚洲国产精品久久精品怡红院| 亚洲综合精品一区二区| 国产精品丝袜白浆摸在线| 美女国内精品自产拍在线播放| 国产精品欧美在线| 成人疯狂猛交xxx| 精品亚洲国产视频| 国产欧美日韩91| 国产精品黄色影片导航在线观看| 中文字幕最新精品| 久久久国产影院| 色综合伊人色综合网| 97视频在线免费观看| 亚洲成人网av| 国产精品丝袜高跟| 欧美激情免费视频| 91精品视频网站| 激情懂色av一区av二区av| 九九精品视频在线观看| 欧美精品videosex牲欧美| 欧美特黄级在线| 亚洲а∨天堂久久精品9966| 亚洲一区二区三区乱码aⅴ| 最近免费中文字幕视频2019| 欧洲中文字幕国产精品| 久久精品国亚洲| 中文字幕国产亚洲2019| 日本精品久久中文字幕佐佐木| 青青草精品毛片| 中文字幕日韩综合av| 成人激情电影一区二区| 日韩欧美中文第一页| 亚洲xxx大片| 欧美视频二区36p| 欧美激情一区二区三级高清视频|