麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

如何編寫高質(zhì)量的VB代碼

2019-11-18 17:31:15
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
什么是一個(gè)高效的軟件?一個(gè)高效的軟件不僅應(yīng)該比實(shí)現(xiàn)同樣功能的軟件運(yùn)行得更快,還應(yīng)該消耗更少的系統(tǒng)資源。這篇文章匯集了作者在使用VB進(jìn)行軟件開發(fā)時(shí)積累下來(lái)的一些經(jīng)驗(yàn),通過(guò)一些簡(jiǎn)單的例子來(lái)向你展示如何寫出高效的VB代碼。其中包含了一些可能對(duì)VB程序員非常有幫助的技術(shù)。在開始之前,先讓我陳清幾個(gè)概念。

  讓代碼一次成型:在我接觸到的程序員中,有很多人喜歡先根據(jù)功能需求把代碼寫出來(lái),然后在此基礎(chǔ)上優(yōu)化代碼。最后發(fā)現(xiàn)為了達(dá)到優(yōu)化的目的,他們不得不把代碼再重新寫一遍。所以我建議你在編寫代碼之前就需要考慮優(yōu)化問(wèn)題。

  把握好優(yōu)化的結(jié)果和需要花費(fèi)的工作之間的關(guān)系:通常當(dāng)完成了一段代碼,你需要檢查和修改它。在檢查代碼的過(guò)程中,也許你會(huì)發(fā)現(xiàn)某些循環(huán)中的代碼效率還可以得到進(jìn)一步的改進(jìn)。在這種情況下,很多追求完美的程序員也許會(huì)立馬修改代碼。我的建議是,如果修改這段代碼會(huì)使程序的運(yùn)行時(shí)間縮短一秒,你可以修改它。如果只能帶來(lái)10毫秒的性能改進(jìn),則不做任何改動(dòng)。這是因?yàn)橹貙懸欢未a必定會(huì)引入新的錯(cuò)誤,而調(diào)試新的代碼必定會(huì)花掉你一定的時(shí)間。程序員應(yīng)該在軟件性能和開發(fā)軟件需要的工作量之間找一個(gè)平衡點(diǎn),而且10毫秒對(duì)于用戶來(lái)說(shuō)也是一個(gè)不能體會(huì)到的差異。

  在需要使用面向?qū)ο蠓椒ǖ臅r(shí)候盡量使用它;VB提供的機(jī)制不完全支持面向?qū)ο蟮脑O(shè)計(jì)和編碼,但是VB提供了簡(jiǎn)單的類。大多數(shù)人認(rèn)為使用對(duì)象將導(dǎo)致代碼的效率降低。對(duì)于這一點(diǎn)我個(gè)人有些不同的意見;考察代碼的效率不能純粹從運(yùn)行速度的角度出發(fā),軟件占用的資源也是需要考慮的因素之一。使用類可以幫助你在整體上提升軟件的性能,這一點(diǎn)我會(huì)在后面的例子中詳細(xì)說(shuō)明。

  當(dāng)你編寫VB代碼的時(shí)候,希望你能把上面幾點(diǎn)作為指導(dǎo)你編碼的原則。我把文章分為兩個(gè)部分:如何提高代碼的運(yùn)行速度和編譯優(yōu)化。
  如何提高代碼的運(yùn)行速度

  下面的這些方法可以幫助你提高代碼的運(yùn)行速度:

  1.使用整數(shù)(Integer)和長(zhǎng)整數(shù)(Long)

  提高代碼運(yùn)行速度最簡(jiǎn)單的方法莫過(guò)于使用正確的數(shù)據(jù)類型了。也許你不相信,但是正確地選擇數(shù)據(jù)類型可以大幅度提升代碼的性能。在大多數(shù)情況下,程序員可以將Single,Double和Currency類型的變量替換為Integer或Long類型的變量,因?yàn)閂B處理Integer和Long的能力遠(yuǎn)遠(yuǎn)高于處理其它幾種數(shù)據(jù)類型。

  在大多數(shù)情況下,程序員選擇使用Single或Double的原因是因?yàn)樗鼈兡軌虮4嫘?shù)。但是小數(shù)也可以保存在Integer類型的變量中。例如程序中約定有三位小數(shù),那么只需要將保存在Integer變量中的數(shù)值除以1000就可以得到結(jié)果。根據(jù)我的經(jīng)驗(yàn),使用Integer和Long替代Single,Double和Currency后,代碼的運(yùn)行速度可以提高將近10倍。

  2.避免使用變體

  對(duì)于一個(gè)VB程序員來(lái)說(shuō),這是再明顯不過(guò)的事情了。變體類型的變量需要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ī)范編碼的話,完全可以避免使用變體類型。

  在這里順帶提一句,對(duì)于Object對(duì)象也存在同樣的問(wèn)題。請(qǐng)看下面的代碼:

  Dimfso
  SetFSO=NewScripting.FileSystemObject
    或
  DimFSOasobject
  SetFSO=NewScripting.FileSystemObject

  上面的代碼由于在申明的時(shí)候沒(méi)有指定數(shù)據(jù)類型,在賦值時(shí)將浪費(fèi)內(nèi)存和CPU時(shí)間。正確的代碼應(yīng)該象下面這樣:

  DimFSOasNewFileSystemObject

  3.盡量避免使用屬性

   在平時(shí)的代碼中,最常見的比較低效的代碼就是在可以使用變量的情況下,反復(fù)使用屬性(PRoperty),尤其是在循環(huán)中。要知道存取變量的速度是存取屬性的速度的20倍左右。下面這段代碼是很多程序員在程序中會(huì)使用到的:

  DimintConasInteger
  ForintCon=0toUbound(SomVar())
  Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)
  NextintCon

  下面這段代碼的執(zhí)行速度是上面代碼的20倍。

  DimintConasInteger
  DimsOutputasString
  ForintCon=0toUbound(SomeVar())
  sOutput=sOutput&vbCrlf&
  SomeVar(intCon)
  Next
  Text1.Text=sOutput

  4.盡量使用數(shù)組,避免使用集合

   除非你必須使用集合(Collection),否則你應(yīng)該盡量使用數(shù)組。據(jù)測(cè)試,數(shù)組的存取速度可以達(dá)到集合的100倍。這個(gè)數(shù)字聽起來(lái)有點(diǎn)駭人聽聞,但是如果你考慮到集合是一個(gè)對(duì)象,你就會(huì)明白為什么差異會(huì)這么大。

  5.展開小的循環(huán)體

   在編碼的時(shí)候,有可能遇到這種情況:一個(gè)循環(huán)體只會(huì)循環(huán)2到3次,而且循環(huán)體由幾行代碼組成。在這種情況下,你可以把循環(huán)展開。原因是循環(huán)會(huì)占用額外的CPU時(shí)間。但是如果循環(huán)比較復(fù)雜,你就沒(méi)有必要這樣做了。

  6.避免使用很短的函數(shù)

   和使用小的循環(huán)體相同,調(diào)用只有幾行代碼的函數(shù)也是不經(jīng)濟(jì)的--調(diào)用函數(shù)所花費(fèi)的時(shí)間或許比執(zhí)行函數(shù)中的代碼需要更長(zhǎng)的時(shí)間。在這種情況下,你可以把函數(shù)中的代碼拷貝到原來(lái)調(diào)用函數(shù)的地方。  

  7.減少對(duì)子對(duì)象的引用

   在VB中,通過(guò)使用.來(lái)實(shí)現(xiàn)對(duì)象的引用。例如:

  Form1.Text1.Text

   在上面的例子中,程序引用了兩個(gè)對(duì)象:Form1和Text1。利用這種方法引用效率很低。但遺憾的是,沒(méi)有辦法可以避免它。程序員唯一可以做就是使用With或者將用另一個(gè)對(duì)象保存子對(duì)象(Text1)。

  注釋:使用With
  WithfrmMain.Text1
  .Text="LearnVB"
  .Alignment=0
  .Tag="Itsmylife"
  .BackColor=vbBlack
  .ForeColor=vbWhite
  EndWith
    或者

  注釋:使用另一個(gè)對(duì)象保存子對(duì)象

  DimtxtTextBoxasTextBox
  SettxtTextBox=frmMain.Text1
  TxtTextBox.Text="LearnVB"
  TxtTextBox.Alignment=0
  TxtTextBox.Tag="Itsmylife"
  TxtTextBox.BackColor=vbBlack
  TxtTextBox.ForeColor=vbWhite

   注意,上面提到的方法只適用于需要對(duì)一個(gè)對(duì)象的子對(duì)象進(jìn)行操作的時(shí)候,下面這段代碼是不正確的:

  WithText1
  .Text="LearnVB"
  .Alignment=0
  .Tag="Itsmylife"
  .BackColor=vbBlack
  .ForeColor=vbWhite
  EndWith

   很不幸的是,我們常常可以在實(shí)際的代碼中發(fā)現(xiàn)類似于上面的代碼。這樣做只會(huì)使代碼的執(zhí)行速度更慢。原因是With塊編譯后會(huì)形成一個(gè)分枝,會(huì)增加了額外的處理工作。    

  8.檢查字符串是否為空

   大多數(shù)程序員在檢查字符串是否為空時(shí)會(huì)使用下面的方法:

  IfText1.Text=""then
  注釋:執(zhí)行操作
  Endif

   很不幸,進(jìn)行字符串比較需要的處理量甚至比讀取屬性還要大。因此我建議大家使用下面的方法:

  IfLen(Text1.Text)=0then
  注釋:執(zhí)行操作
  Endif

  9.去除Next關(guān)鍵字后的變量名

   在Next關(guān)鍵字后加上變量名會(huì)導(dǎo)致代碼的效率下降。我也不知道為什么會(huì)這樣,只是一個(gè)經(jīng)驗(yàn)而已。不過(guò)我想很少有程序員會(huì)這樣畫蛇添足,畢竟大多數(shù)程序員都是惜字如金的人。

  注釋:錯(cuò)誤的代碼
  ForiCount=1to10
  注釋:執(zhí)行操作
  NextiCount
  注釋:正確的代碼
  ForiCount=1to10
  注釋:執(zhí)行操作
  Next  

  10.使用數(shù)組,而不是多個(gè)變量

    當(dāng)你有多個(gè)保存類似數(shù)據(jù)的變量時(shí),可以考慮將他們用一個(gè)數(shù)組代替。在VB中,數(shù)組是最高效的數(shù)據(jù)結(jié)構(gòu)之一。

  11.使用動(dòng)態(tài)數(shù)組,而不是靜態(tài)數(shù)組

    使用動(dòng)態(tài)數(shù)組對(duì)代碼的執(zhí)行速度不會(huì)產(chǎn)生太大的影響,但是在某些情況下可以節(jié)約大量的資源。

  12.銷毀對(duì)象

    無(wú)論編寫的是什么軟件,程序員都需要考慮在用戶決定終止軟件運(yùn)行后釋放軟件占用的內(nèi)存空間。但遺憾的是很多程序員對(duì)這一點(diǎn)好像并不是很在意。正確的做法是在退出程序前需要銷毀程序中使用的對(duì)象。例如:

  DimFSOasNewFileSystemObject
  注釋:執(zhí)行操作
  注釋:銷毀對(duì)象
  SetFSO=Nothing
  對(duì)于窗體,可以進(jìn)行卸載:
  UnloadfrmMain
    或
  SetfrmMain=Nothing

  13.變長(zhǎng)和定長(zhǎng)字符串

    從技術(shù)上來(lái)說(shuō),與變長(zhǎng)字符串相比,定長(zhǎng)字符串需要較少的處理時(shí)間和空間。但是定長(zhǎng)字符串的缺點(diǎn)在于在很多情況下,你都需要調(diào)用Trim函數(shù)以去除字符串末的空字符,這樣反而會(huì)降低代碼效率。所以除非是字符串的長(zhǎng)度不會(huì)變化,否則還是使用變長(zhǎng)字符串。

  14.使用類模塊,而不是ActiveX控件

    除非ActiveX控件涉及到用戶界面,否則盡量使用輕量的對(duì)象,例如類。這兩者之間的效率有很大差異。

  15.使用內(nèi)部對(duì)象

    在涉及到使用ActiveX控件和DLL的時(shí)候,很多程序員喜歡將它們編譯好,然后再加入工程中。我建議你最好不要這樣做,因?yàn)閺腣B連接到一個(gè)外部對(duì)象需要耗費(fèi)大量的CPU處理能力。每當(dāng)你調(diào)用方法或存取屬性的時(shí)候,都會(huì)浪費(fèi)大量的系統(tǒng)資源。如果你有ActiveX控件或DLL的源代碼,將它們作為工程的私有對(duì)象。

  16.減少模塊的數(shù)量

    有些人喜歡將通用的函數(shù)保存在模塊中,對(duì)于這一點(diǎn)我表示贊同。但是在一個(gè)模塊中只寫上二三十行代碼就有些可笑了。如果你不是非常需要模塊,盡量不要使用它。這樣做的原因是因?yàn)橹挥性谀K中的函數(shù)或變量被調(diào)用時(shí),VB才將模塊加載到內(nèi)存中;當(dāng)VB應(yīng)用程序退出時(shí),才會(huì)從內(nèi)存中卸載這些模塊。如果代碼中只有一個(gè)模塊,VB就只會(huì)進(jìn)行一次加載操作,這樣代碼的效率就得到了提高;反之如果代碼中有多個(gè)模塊,VB會(huì)進(jìn)行多次加載操作,代碼的效率會(huì)降低。

  17.使用對(duì)象數(shù)組

    當(dāng)設(shè)計(jì)用戶界面時(shí),對(duì)于同樣類型的控件,程序員應(yīng)該盡量使用對(duì)象數(shù)組。你可以做一個(gè)實(shí)驗(yàn):在窗口上添加100個(gè)PictureBox,每個(gè)PictureBox都有不同的名稱,運(yùn)行程序。然后創(chuàng)建一個(gè)新的工程,同樣在窗口上添加100個(gè)PictureBox,不過(guò)這一次使用對(duì)象數(shù)組,運(yùn)行程序,你可以注意到兩個(gè)程序加載時(shí)間上的差別。  

  18.使用Move方法

    在改變對(duì)象的位置時(shí),有些程序員喜歡使用Width,Height,Top和Left屬性。例如:

  Image1.Width=100
  Image1.Height=100
  Image1.Top=0
  Image1.Left=0

    實(shí)際上這樣做效率很低,因?yàn)槌绦蛐薷牧怂膫€(gè)屬性,而且每次修改之后,窗口都會(huì)被重繪。正確的做法是使用Move方法:

  Image1.Move0,0,100,100

  19.減少圖片的使用

    圖片將占用大量?jī)?nèi)存,而且處理圖片也需要占用很多CPU資源。在軟件中,如果可能的話,可以考慮用背景色來(lái)替代圖片--當(dāng)然這只是從技術(shù)人員的角度出發(fā)看這個(gè)問(wèn)題。

  20.使用ActiveXDLL,而不是ActiveX控件

    如果你設(shè)計(jì)的ActiveX對(duì)象不涉及到用戶界面,使用ActiveXDLL。

  編譯優(yōu)化

    我所見過(guò)的很多VB程序員從來(lái)沒(méi)有使用過(guò)編譯選項(xiàng),也沒(méi)有試圖搞清楚各個(gè)選項(xiàng)之間的差別。下面讓我們來(lái)看一下各個(gè)選項(xiàng)的具體含義。

  1.P-代碼(偽代碼)和本機(jī)代碼

   你可以選擇將軟件編譯為P-代碼或是本機(jī)代碼。缺省選項(xiàng)是本機(jī)代碼。那什么是P-代碼和本機(jī)代碼呢?

  P-代碼:當(dāng)在VB中執(zhí)行代碼時(shí),VB首先是將代碼編譯為P-代碼,然后再解釋執(zhí)行編譯好的P-代碼。在編譯環(huán)境下,使用這種代碼要比本機(jī)代碼快。選擇P-代碼后,編譯時(shí)VB將偽代碼放入一個(gè)EXE文件中。

   本機(jī)代碼:本機(jī)代碼是VB6以后才推出的選項(xiàng)。當(dāng)編譯為EXE文件后,本機(jī)代碼的執(zhí)行速度比P-代碼快。選擇本機(jī)代碼后,編譯時(shí)VB使用機(jī)器指令生成EXE文件。

   在使用本機(jī)代碼進(jìn)行編譯時(shí),我發(fā)現(xiàn)有時(shí)候會(huì)引入一些莫名其妙的錯(cuò)誤。在編譯環(huán)境中我的代碼完全正確地被執(zhí)行了,但是用本機(jī)代碼選項(xiàng)生成的EXE文件卻不能正確執(zhí)行。通常這種情況是在卸載窗口或彈出打印窗口時(shí)發(fā)生的。我通過(guò)在代碼中加入DoEvent語(yǔ)句解決了這個(gè)問(wèn)題。當(dāng)然出現(xiàn)這種情況的幾率非常少,也許有些VB程序員從來(lái)沒(méi)有遇到過(guò),但是它的確存在。  

   在本機(jī)代碼中還有幾個(gè)選項(xiàng):

   a)代碼速度優(yōu)化:該選項(xiàng)可以編譯出速度較快的執(zhí)行文件,但執(zhí)行文件比較大。推薦使用

   b)代碼大小優(yōu)化:該選項(xiàng)可以編譯出比較小的執(zhí)行文件,但是以犧牲速度為代價(jià)的,不推薦使用。

   c)無(wú)優(yōu)化:該選項(xiàng)只是將P-代碼轉(zhuǎn)化為本機(jī)代碼,沒(méi)有做任何優(yōu)化。在調(diào)試代碼時(shí)可以使用。

   d)針對(duì)PentiumPro優(yōu)化:雖然該項(xiàng)不是本機(jī)代碼中的缺省選項(xiàng),但是我通常會(huì)使用該選項(xiàng)。該選項(xiàng)編譯出的可執(zhí)行程序在PentiumPro和Pentium2以上的機(jī)器上可以運(yùn)行得更快,而在比較老的機(jī)器上要稍稍慢一些。考慮到現(xiàn)在用Pentium2都是落伍,所以推薦大家使用該選項(xiàng)。

   e)產(chǎn)生符號(hào)化調(diào)試信息:該項(xiàng)在編譯過(guò)程中生成一些調(diào)試信息,使用戶可以利用VisualC 一類的工具來(lái)調(diào)試編譯好的代碼。使用該選項(xiàng)會(huì)生成一個(gè).pdf文件,該文件記錄了可執(zhí)行文件中的標(biāo)志信息。當(dāng)程序擁有API函數(shù)或DLL調(diào)用時(shí),該選項(xiàng)還是比較有幫助的。

  2.高級(jí)優(yōu)化

   高級(jí)優(yōu)化中的設(shè)置可以幫助你提高軟件的速度,但是有時(shí)候也會(huì)引入一些錯(cuò)誤,因此我建議大家盡量小心地使用它們。如果在代碼中有比較大的循環(huán)體或者復(fù)雜的數(shù)學(xué)運(yùn)算時(shí),選中高級(jí)優(yōu)化中的某些項(xiàng)會(huì)大幅度提升代碼的性能。如果你使用了高級(jí)優(yōu)化功能,我建議你嚴(yán)格測(cè)試編譯好的文件。

   a)假定無(wú)別名:可以提高循環(huán)體中代碼的執(zhí)行效率,但是在如果通過(guò)變量的引用改變變量值的情況下,例如調(diào)用一個(gè)方法,變量的引用作為方法的參數(shù),在方法中改變了變量的值的話,就會(huì)引發(fā)錯(cuò)誤。有可能只是返回的結(jié)果錯(cuò)誤,也有可能是導(dǎo)致程序中斷運(yùn)行的嚴(yán)重錯(cuò)誤。

   b)取消數(shù)組綁定檢查、取消整數(shù)溢出檢查和取消浮點(diǎn)錯(cuò)誤檢查:在程序運(yùn)行時(shí),如果通過(guò)這些檢查發(fā)現(xiàn)了錯(cuò)誤,錯(cuò)誤處理代碼會(huì)處理這些錯(cuò)誤。但是如果取消了這些檢查,發(fā)生了錯(cuò)誤程序就無(wú)法處理。只有當(dāng)你確定你的代碼中不會(huì)出現(xiàn)上面的這些錯(cuò)誤時(shí),你才可以使用這些選項(xiàng)。它們將使軟件的性能得到很大的提升。

   c)允許不舍入的浮點(diǎn)操作:選擇該選項(xiàng)可以是編譯出來(lái)的程序更快地處理浮點(diǎn)操作。它唯一的缺點(diǎn)就是在比較兩個(gè)浮點(diǎn)數(shù)時(shí)可能會(huì)導(dǎo)致不正確的結(jié)果。

   d)取消PentiumFDIV安全檢查:該選項(xiàng)是針對(duì)一些老的Pentium芯片設(shè)置的,現(xiàn)在看來(lái)已經(jīng)過(guò)時(shí)了。

->


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 免费观看一区 | av在线播放免费观看 | 久久精品资源 | 欧洲精品久久久 | 久久久久91视频 | www日韩大片 | 色人久久 | 国产91久久久久久 | 91九色电影| 欧洲精品久久久 | 国产成人精品区 | a级高清免费毛片av在线 | 精精国产xxxx视频在线野外 | 天天看成人免费毛片视频 | 天天看成人免费毛片视频 | 国内精品久久久久久久久久 | 12av电影 | 91网站在线观看视频 | 亚洲国产视频在线 | 日日碰日日操 | 伊人久操视频 | 韩国一大片a毛片 | 久久精品一区二区三 | 中国国语毛片免费观看视频 | 国产成人综合在线观看 | 久久综合久久精品 | 一区国产视频 | 香蕉久久久| 天海翼无删减av三级在线观看 | 在线观看国产一区二区 | av在线大全 | 亚洲亚色 | 欧美性生活区 | 久久精品视频一区二区三区 | 97青青草视频 | 免费a级黄色片 | 91女上位 在线播放 性欧美日本 | 日日操夜夜操视频 | 成人三级视频网站 | 精品一区二区免费 | 久久久电影电视剧免费看 |