今天在淘百度的時(shí)候看到了這篇文章。覺(jué)得很不錯(cuò)。就給親們分享下。
如果你想學(xué)好易語(yǔ)言的話請(qǐng)仔細(xì)看看以下的內(nèi)容吧。看完此文之后保證你大有收獲。
什么是一個(gè)高效的軟件?一個(gè)高效的軟件不僅應(yīng)該比實(shí)現(xiàn)同樣功能的軟件運(yùn)行得更快,還應(yīng)該消耗更少的系統(tǒng)資源。程序的時(shí)間效率是指運(yùn)行速度,空間效率是指程序占用內(nèi)存或者外存的狀況。另外程序的效率我們也可以分為全局效率和局部效率。全局效率是指站在整個(gè)系統(tǒng)的角度上考慮的效率,局部效率是指站在模塊或函數(shù)角度上考慮的效率。
1. 使用整數(shù)和長(zhǎng)整數(shù)
提高代碼運(yùn)行速度最簡(jiǎn)單的方法莫過(guò)于使用正確的數(shù)據(jù)類(lèi)型了。也許你不相信,但是 正確地選擇數(shù)據(jù)類(lèi)型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將短整數(shù)型、小數(shù)型和雙精度小數(shù)型的變量替換為整數(shù)(Integer)或長(zhǎng)整數(shù)(Long)類(lèi)型的變量,因?yàn)橐渍Z(yǔ)言處理整數(shù)和長(zhǎng)整數(shù)的能力遠(yuǎn)遠(yuǎn)高于處理其它幾種數(shù)據(jù)類(lèi)型。
在大多數(shù)情況下,程序員選擇使用小數(shù)型或雙精度小數(shù)型的原因是因?yàn)樗鼈兡軌虮4嫘?shù)。但是小數(shù)也可以保存在整數(shù)類(lèi)型的變量中。例如程序中約定有三位小數(shù),那么只需要將保存在整數(shù)型變量中的數(shù)值除以1000就可以得到結(jié)果。根據(jù)我的經(jīng)驗(yàn),使用整數(shù)和長(zhǎng)整數(shù)替代短整數(shù)型、小數(shù)型和雙精度小數(shù)型后,代碼的運(yùn)行速度可以提高將近10倍。
但是我們也不要老是強(qiáng)調(diào)使用使用整數(shù)和長(zhǎng)整數(shù),因?yàn)樵诔绦蛑袛?shù)據(jù)類(lèi)型的定義還牽涉一個(gè)關(guān)鍵的問(wèn)題,就是數(shù)據(jù)的安全,頻繁而無(wú)規(guī)范地定義數(shù)據(jù)類(lèi)型會(huì)使算法出現(xiàn)漏洞,是數(shù)據(jù)的安全和臨界判斷有問(wèn)題.對(duì)財(cái)務(wù)和工程計(jì)算而言,小數(shù)點(diǎn)的精度是很敏感的數(shù)據(jù),只能用雙精度數(shù)據(jù)來(lái)規(guī)范.另外, 換成整型也會(huì)導(dǎo)致程序可讀性急劇下降.
2. 避免使用通用型數(shù)據(jù)
通用型的變量需要16個(gè)字節(jié)的空間來(lái)保存數(shù)據(jù),而一個(gè)整數(shù)(Integer)只需要2個(gè)字節(jié)。通常使用通用型變量的目的是為了減少設(shè)計(jì)的工作量和代碼量,也有的程序員圖個(gè)省事而使用它。但是如果一個(gè)軟件經(jīng)過(guò)了嚴(yán)格設(shè)計(jì)和按照規(guī)范編碼的話,完全可以避免使用變體類(lèi)型。
3. 盡量避免使用屬性
在平時(shí)的代碼中,最常見(jiàn)的比較低效的代碼就是在可以使用變量的情況下,反復(fù)使用屬性(Property),尤其是在循環(huán)中。要知道存取變量的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會(huì)使用到的:
容器名: 數(shù)值 類(lèi)型:整數(shù)型
容器名: 容器 類(lèi)型:整數(shù)型
計(jì)次循環(huán)首(7,容器)
文本1.內(nèi)容 = 文本1.內(nèi)容 + #換行符 + 到文本((數(shù)值×容器))
計(jì)次循環(huán)尾()
下面這段代碼的執(zhí)行速度是上面代碼的20倍。
容器名: 文本 類(lèi)型:文本型
文本 = 文本1.內(nèi)容
文本 = 文本 + #換行符 + 到文本((數(shù)值×容器))
文本1.內(nèi)容 = 文本
另外要注意,這個(gè)涉及一個(gè)編程思路,用屬性當(dāng)變量的作法大多數(shù)情況可以簡(jiǎn)化算法。所以有時(shí)候也不能一味強(qiáng)調(diào)用變量代替屬性。
6. 避免調(diào)用很短的子程序
調(diào)用只有幾行代碼的子程序也是不經(jīng)濟(jì)的--調(diào)用子程序所花費(fèi)的時(shí)間或許比執(zhí)行子程序中的代碼需要更長(zhǎng)的時(shí)間。在這種情況下,你可以把子程序中的代碼拷貝到原來(lái)調(diào)用子程序的地方。
但是有時(shí)候小的子程序可能會(huì)被調(diào)用很多次而不是只有兩三次,這時(shí)就應(yīng)該調(diào)用它。
7. 減少對(duì)子對(duì)象的引用
在易語(yǔ)言中,通過(guò)使用.來(lái)實(shí)現(xiàn)對(duì)象的引用。例如:
窗口1.編輯框1.內(nèi)容
在上面的例子中,程序引用了兩個(gè)對(duì)象:窗口1和編輯框1。利用這種方法引用效率很低。但遺憾的是,沒(méi)有辦法可以避免它。我的“多媒體模塊”就有這個(gè)缺點(diǎn)。
8. 檢查文本型數(shù)據(jù)是否為空
大多數(shù)易語(yǔ)言用戶(hù)在檢查文本型數(shù)據(jù)是否為空時(shí)會(huì)使用下面的方法:
如果 (文本1.內(nèi)容 = "" )
注釋?zhuān)?執(zhí)行操作
結(jié)束如果
很不幸,進(jìn)行字符串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:
如果 (到數(shù)值(文本1.內(nèi)容) = 0 )
另一個(gè)不同的意見(jiàn)是:?jiǎn)栴}在于當(dāng)文本字串為 "ABC"之類(lèi)的非數(shù)值型時(shí), 到數(shù)值("ABC")=0并不表示為空。文本比較的效率并不低,在底層算法中,一般會(huì)直接比較長(zhǎng)度才會(huì)繼續(xù)比較內(nèi)容。
9. 使用數(shù)組,而不是多個(gè)變量
當(dāng)你有多個(gè)保存類(lèi)似數(shù)據(jù)的變量時(shí),可以考慮將他們用一個(gè)數(shù)組代替。在易語(yǔ)言中,數(shù)組是最高效的數(shù)據(jù)結(jié)構(gòu)之一。
10. 盡量使用動(dòng)態(tài)數(shù)組,而不是靜態(tài)數(shù)組
使用動(dòng)態(tài)數(shù)組對(duì)代碼的執(zhí)行速度不會(huì)產(chǎn)生太大的影響,但是在某些情況下可以節(jié)約大量的資源。
11. 銷(xiāo)毀對(duì)象
無(wú)論編寫(xiě)的是什么軟件,程序員都需要考慮在用戶(hù)決定終止軟件運(yùn)行后釋放軟件占用的內(nèi)存空間。但遺憾的是很多用戶(hù)對(duì)這一點(diǎn)好像并不是很在意。正確的做法是在退出程序前需要銷(xiāo)毀程序中使用的對(duì)象。例如:關(guān)閉數(shù)據(jù)庫(kù):關(guān)閉(數(shù)據(jù)庫(kù)名稱(chēng))、全部關(guān)閉(),關(guān)閉打開(kāi)(播放)的文件,關(guān)閉載入的圖片等。
中止程序執(zhí)行時(shí)應(yīng)該要關(guān)閉打開(kāi)的文件(包括數(shù)據(jù)庫(kù)文件、圖片文件等),但是窗口銷(xiāo)毀對(duì)銷(xiāo)毀窗口及窗口單元來(lái)說(shuō)是自動(dòng)的,已足夠做釋放用,在窗口內(nèi)最好不要隨意銷(xiāo)毀窗口單元,可能會(huì)導(dǎo)致程序運(yùn)行中的潛在的單元數(shù)據(jù)訪問(wèn)而崩潰.只有在圖形buffer情況才需要經(jīng)常銷(xiāo)毀。
12. 盡量使用內(nèi)部子程序,減少易模塊的數(shù)量
因?yàn)閺囊渍Z(yǔ)言連接到一個(gè)外部對(duì)象需要耗費(fèi)大量的CPU處理能力。每當(dāng)你調(diào)用接口函數(shù)的時(shí)候,都會(huì)浪費(fèi)大量的系統(tǒng)資源。
另外只有在易模塊中的接口函數(shù)或變量被調(diào)用時(shí),易語(yǔ)言才將易模塊加載到內(nèi)存中;當(dāng)易語(yǔ)言應(yīng)用程序退出時(shí),才會(huì)從內(nèi)存中卸載這些模塊。如果代碼中只有一個(gè)模塊,易語(yǔ)言就只會(huì)進(jìn)行一次加載操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個(gè)模塊,易語(yǔ)言會(huì)進(jìn)行多次加載操作,代碼的效率會(huì)降低。
13. 使用對(duì)象數(shù)組
當(dāng)設(shè)計(jì)用戶(hù)界面時(shí),對(duì)于同樣類(lèi)型的控件,程序員應(yīng)該盡量使用對(duì)象數(shù)組。你可以做一個(gè)實(shí)驗(yàn):在窗口上添加100個(gè)圖片框,每個(gè)圖片框都有不同的名稱(chēng),運(yùn)行程序。然后創(chuàng)建一個(gè)新的工程,同樣在窗口上添加100個(gè)圖片框,不過(guò)這一次使用對(duì)象數(shù)組,運(yùn)行程序,你可以注意到兩個(gè)程序加載時(shí)間上的差別。
也有人認(rèn)為兩者從邏輯上看效率應(yīng)該差不多。
14. 使用窗口單元“移動(dòng)”方法
在改變對(duì)象的位置時(shí),有些用戶(hù)喜歡使用“寬度”、“高度”、“頂邊”和“左邊”屬性。例如:
按鈕1.寬度 = 100
按鈕1.高度 = 100
按鈕1.頂邊 = 0
按鈕1.左邊 = 0
實(shí)際上這樣做效率很低,因?yàn)槌绦蛐薷牧怂膫€(gè)屬性,而且每次修改之后,窗口都會(huì)被重繪。正確的做法是使用Move方法:
按鈕1.移動(dòng)(0,0,100,100)
15. 減少圖片的使用
圖片將占用大量?jī)?nèi)存,而且處理圖片也需要占用很多CPU資源。在軟件中,如果可能的話,可以考慮用背景色來(lái)替代圖片--當(dāng)然這只是從技術(shù)人員的角度出發(fā)看這個(gè)問(wèn)題。
但是如果為了優(yōu)化程序界面,使用圖形換來(lái)的好處可能遠(yuǎn)勝節(jié)約下的資源,否則就不會(huì)有XP,也不會(huì)有游戲的進(jìn)步了。
16. 編譯優(yōu)化
易語(yǔ)言的程序編譯有三個(gè)選項(xiàng):“編譯”、“獨(dú)立編譯”、“編譯生成安裝軟件”。優(yōu)先使用的次序應(yīng)該是“編譯生成安裝軟件”、“編譯”、“獨(dú)立編譯”,因?yàn)?ldquo;獨(dú)立編譯”會(huì)將易語(yǔ)言系統(tǒng)中所有的支持庫(kù)都編譯進(jìn)去,而“編譯生成安裝軟件”只選擇程序中必要的支持庫(kù)編譯。要脫離易語(yǔ)言環(huán)境也可以運(yùn)行,就不要使用“編譯”而應(yīng)用“編譯生成安裝軟件”或“獨(dú)立編譯”。
總結(jié):執(zhí)行效率和程序可讀性永遠(yuǎn)是對(duì)矛盾,兩者應(yīng)該通盤(pán)考慮;資源占用和程序易用性永遠(yuǎn)是對(duì)矛盾,兩者也應(yīng)該通盤(pán)考慮。基于此,下面探討一些提高程序的效率的規(guī)則。
【規(guī)則1】不要一味地追求程序的效率,應(yīng)當(dāng)在滿足正確性、可靠性、健壯性、可讀性等質(zhì)量因素的前提下,設(shè)法提高程序的效率。
【規(guī)則2】以提高程序的全局效率為主,提高局部效率為輔。
【規(guī)則3】在優(yōu)化程序的效率時(shí),應(yīng)當(dāng)先找出限制效率的“瓶頸”,不要在無(wú)關(guān)緊要之處優(yōu)化。
【規(guī)則4】先優(yōu)化數(shù)據(jù)結(jié)構(gòu)和算法,再優(yōu)化執(zhí)行代碼。先考慮某功能是否可以用函數(shù)(命令)來(lái)實(shí)現(xiàn),如果找不到這樣的函數(shù),再考慮用其他代碼實(shí)現(xiàn)。
【規(guī)則5】有時(shí)候時(shí)間效率和空間效率可能對(duì)立,此時(shí)應(yīng)當(dāng)分析那個(gè)更重要,作出適當(dāng)?shù)恼壑浴@缍嗷ㄙM(fèi)一些內(nèi)存來(lái)提高性能。
【規(guī)則6】不要在什么時(shí)候都只追求緊湊的代碼,因?yàn)榫o湊的代碼并不能產(chǎn)生高效的機(jī)器碼。
新聞熱點(diǎn)
疑難解答
圖片精選