15種ASP技巧
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
*技巧1:給應(yīng)用層文件使用GLOBAL.ASA 將文件加載GLOBAL.ASA中的一個(gè)應(yīng)用層數(shù)組中,而不是通過(guò)使用ASP文件系統(tǒng)對(duì)像在頁(yè)面上讀取文件。 GLOBAL.ASA可用于指定事件腳本,也可用于聲明擁有session或應(yīng)用程序范圍的對(duì)象。它不直接顯示給用戶,而是存儲(chǔ)應(yīng)用層事件的信息和對(duì)象。然后通過(guò)頁(yè)面就可以指向存有數(shù)據(jù)的應(yīng)用層數(shù)組。這就意味著每有一個(gè)服務(wù)器端請(qǐng)求就讀一次文件,不是每個(gè)用戶每頁(yè)讀一次。你可以運(yùn)行一個(gè)獨(dú)立的ASP文件去刷新應(yīng)用層數(shù)組的內(nèi)容,同時(shí)你也可以考慮使用dictionary對(duì)像(見(jiàn)技巧9)。 這個(gè)技巧可以大大加快你的系統(tǒng)速度。 那么將如何實(shí)現(xiàn)該技巧呢? 如果你是一個(gè)腳本編寫(xiě)人員,必須使用文件系統(tǒng)對(duì)像讀取文件放入一個(gè)數(shù)組或一個(gè)dictionary對(duì)像中。然后在GLOBAL.ASA中讀取文件并且把數(shù)組(放有你讀取的文件內(nèi)容)或dictionary對(duì)像放到應(yīng)用層聲明中。這樣就可讓用戶在數(shù)組或dictionary對(duì)像中存取信息,而不必每次通過(guò)一個(gè)ASP請(qǐng)求去提交信息。 但也許你會(huì)想"如果緩存中的內(nèi)容需要更新又該怎么辦呢?我敢打賭不會(huì)用到。"其實(shí)不然。如果緩存中的內(nèi)容需要更新,你可以調(diào)用一個(gè)包含有可執(zhí)行應(yīng)用程序鎖定命令腳本的僅管理員可存取的ASP文件,在數(shù)組或dictionary對(duì)像中更新緩存信息,最后執(zhí)行應(yīng)用程序鎖定命令。 *技巧2:從產(chǎn)品源代碼中移去HTML注釋(IIS3.0適用) 不錯(cuò),難寫(xiě)的肯定也難懂。開(kāi)個(gè)玩笑,這不代表要你把所有的HTML注釋去掉(腳本注釋就挺好的),大范圍的HTML文本都能成批的拷貝到客戶端。這樣的話,你的腳本在IIS3.0上會(huì)運(yùn)行得更快(在IIS4.0中,HTML注釋不再會(huì)導(dǎo)致執(zhí)行速度的降低)。 *技巧3:多個(gè)Response.write聲明 如果你是在代碼中的好幾個(gè)地方用格式書(shū)寫(xiě)輸出結(jié)果,那么考慮一下把這些結(jié)果合到一塊,用一個(gè)Response.write語(yǔ)句寫(xiě)出來(lái)。然后你再看看你的HTML代碼和vbscript腳本的組成。不要把HTML和vbscript腳本散布得太開(kāi),盡量寫(xiě)成成塊的HTML和vbscript腳本。 *技巧4:使用<OBJECT>標(biāo)志例示對(duì)像 如果你需要指向那些也許用不著的對(duì)象,那么就用<OBJECT>標(biāo)志例示,而不是用Server.createobject.用Server.createobject將立刻生成該對(duì)象,如果你以后都用不著它的話,就等于浪費(fèi)資源。 *技巧5:盡可能的使用本地(局部)變量 (以下的新技巧將取代較早前發(fā)布的"在一行內(nèi)定義變量",其中包含有一些錯(cuò)誤觀點(diǎn)): 局部變量是在子程序和函數(shù)中定義的(也就是常說(shuō)局部范圍的變量),這些變量被編譯成數(shù)字指向并放入一張表中。這些局部變量的指向可以通過(guò)一次編譯完成。而全局變量則是在運(yùn)行時(shí)被執(zhí)行的。這就意味著局部變量的存取要比全局變量快好幾倍。而且,多維全局變量是其中最慢的,當(dāng)?shù)谝淮问褂靡粋€(gè)多維全局變量時(shí),在新的對(duì)象產(chǎn)生之前,就要在整個(gè)對(duì)象模型中搜索一遍同名的對(duì)象。 以下是一個(gè)非常常見(jiàn)的例子: Foo.bar.blah.baz = Foo.bar.blah.qaz(1) If Foo.bar.blah.zaq = Foo.bar.blah.abc then 運(yùn)行時(shí)產(chǎn)生如下結(jié)果: 1)變量Foo被定義為一個(gè)全局變量2)變量bar被定義為Foo的一個(gè)成員3)變量blah被定義為Foo.bar的一個(gè)成員4)變量qaz被定義為Foo.bar.blah的一個(gè)成員5)調(diào)用Foo.bar.blah.quaz(1)6)重復(fù)1至3。系統(tǒng)并不知道如果調(diào)用qaz改變了對(duì)象模型1-3步必須重新執(zhí)行7)定義baz為Foo.bar.blah的成員,輸出值8)重復(fù)1-3,執(zhí)行zaq9)重復(fù)1-3,執(zhí)行abc 正如你看到的,效率極其低下,最快的方法就是把這些代碼寫(xiě)在vbscript中: Set myobj = Foo.bar.blah ' do the resolution of blah ONCEMyobj.baz = myobj.qaz(1)If Myobj.zaq = Myobj.abc then *技巧6:避免重復(fù)定義數(shù)組 當(dāng)我們?cè)谑褂胐im時(shí),避免重新定義數(shù)組。因?yàn)槟憧赡芤胷edim去重新定義數(shù)組的大小。至于要做這樣的操作的話,如果你的機(jī)器內(nèi)存不是很大,那么最好在一開(kāi)始就考慮到最壞的打算去設(shè)置數(shù)組的長(zhǎng)度或者設(shè)置最佳狀態(tài)時(shí)的長(zhǎng)度,在非常必要時(shí)才使用redim。當(dāng)然這樣并不意味著要去增加內(nèi)存,如果你不是很需要的話。 以下舉例說(shuō)明不恰當(dāng)?shù)氖褂胷edim 其實(shí)在開(kāi)始就定義myarray(5),而以后需要的話再用redim去增加他的大小,這樣的話可能會(huì)占用一些內(nèi)存,但速度就要快得多了。 *技巧7:避免公用(全局)變量 不要使用用public定義的變量。如果你是寫(xiě)vbscript或在ActiveX控件或java applet中存取變量,那么盡可能避免公用變量。public關(guān)鍵詞通常是為以后使用設(shè)計(jì)的,既然public不能給你帶來(lái)什么好處,那最好還是用dim吧。 *技巧8:使用絕對(duì)路徑 如果可能的話盡量避免使用相對(duì)路徑,而使用絕對(duì)路徑。使用相對(duì)路徑將需要IIS返回當(dāng)前服務(wù)器路徑,這就意味著對(duì)IIS的特殊請(qǐng)求造成執(zhí)行速度低下。 注:慢點(diǎn)就慢點(diǎn)唄,使用相對(duì)路徑移植什么的都方便得多呀。 *技巧9:使用"Dictionary"對(duì)像 VBScript中提供的dictionary對(duì)象可提供快速查找和任意帶關(guān)鍵詞數(shù)據(jù)的存儲(chǔ)。通過(guò)dictionary對(duì)象可以根據(jù)關(guān)鍵詞存取數(shù)組中的各項(xiàng)數(shù)據(jù),這樣就能更快地找到在內(nèi)存中不連續(xù)的內(nèi)容(因?yàn)槟闶侵付阏谑褂玫年P(guān)鍵詞,而不是要知道對(duì)像在數(shù)組中存放的位置)。如果你要查找的是非線性的關(guān)鍵詞數(shù)據(jù),使用dictionary對(duì)象就要快得多了。 然而,如果關(guān)鍵詞數(shù)據(jù)在內(nèi)存中是連續(xù)的,那么數(shù)組在查找、存儲(chǔ)數(shù)據(jù)起來(lái)將更快。同時(shí)也需要注意的是在dictionary中建立索引要比在數(shù)組中慢。你應(yīng)該選擇對(duì)你來(lái)說(shuō)效果最好的數(shù)據(jù)結(jié)構(gòu)。 *技巧10:充分利用瀏覽器的回退功能 如果你使用的是個(gè)smart的瀏覽器,那么他會(huì)幫你做很多的回退工作,只要用得著,不妨多用用。那么,通過(guò)你的腳本執(zhí)行回退,當(dāng)有任何錯(cuò)誤發(fā)生時(shí)你可以回到前面去,并從后訪問(wèn)數(shù)據(jù)庫(kù)。但要記住的是,當(dāng)你訪問(wèn)服務(wù)器上存在的數(shù)據(jù)庫(kù)時(shí)就要執(zhí)行一次對(duì)數(shù)據(jù)庫(kù)的操作。如果你要返回的那個(gè)窗體有很多變量的話,那就有點(diǎn)劃不來(lái)了。如果你確實(shí)知道你需要在客戶端執(zhí)行很多代碼,那么為了加快執(zhí)行速度把代碼移到客戶端。當(dāng)你在客戶端運(yùn)行時(shí),處理器就歸你了,服務(wù)器呢,只好用他自身的處理能力去處理他所接到的請(qǐng)求。 還有個(gè)好辦法,如果你使用的窗體中用了很多服務(wù)器端的腳本并且有不少條件輸入,那么最好把這些觸發(fā)反應(yīng)的代碼放到客戶端腳本引擎中去(比如vbscript,javascript)。忽略這些,服務(wù)器代碼運(yùn)行得就快了,因?yàn)閷?duì)于那些不是很必要的代碼就不送到服務(wù)器端執(zhí)行了。當(dāng)然這僅對(duì)那些比較小的代碼適用,至于大的嘛,就不太合適了。 *技巧11:避免使用服務(wù)器端變量 通過(guò)服務(wù)器端變量進(jìn)行訪問(wèn)數(shù)據(jù)時(shí),就需要web向服務(wù)器提出請(qǐng)求,然后收集所有的服務(wù)器端變量,而不僅僅只是你請(qǐng)求的那個(gè)變量。這就類似于你要從發(fā)霉閣樓的盒子里找一樣特定的東西。當(dāng)你要找那個(gè)東西時(shí),首先要從閣樓里找到盒子。當(dāng)你請(qǐng)求一個(gè)變量時(shí)服務(wù)器也是一樣,當(dāng)遇到你請(qǐng)求的哪個(gè)變量時(shí)觸發(fā)執(zhí)行,然后再去請(qǐng)求那些不會(huì)引起執(zhí)行點(diǎn)的變量。 *技巧12:使用"option explicit" 在asp文件中寫(xiě)上。和c不同,vb允許你在不強(qiáng)制定義變量之前就可以使用該變量。把option explicit打開(kāi)有助于識(shí)別沒(méi)定義的變量,使用沒(méi)定義的變量就會(huì)出現(xiàn)錯(cuò)誤提示信息。同時(shí)也可以使那些沒(méi)申明的局部變量非法。沒(méi)申明的局部變量和全局變量一樣慢(比定義過(guò)的局部變量要慢一倍)。把option explicit打開(kāi)自然能幫你把這些小蟲(chóng)子從你的代碼中去掉。 *技巧13:將采集到的值拷貝到本地(局部)變量當(dāng)中 如果有一些值是你要反復(fù)用到的話,把這些值用局部變量的形式拷貝到客戶端。每次當(dāng)你要用到這些值時(shí),就省去了你去那一堆值里面去找了,這樣也就加快了腳本運(yùn)行速度。 *技巧14:謹(jǐn)慎使用session對(duì)像 使用session對(duì)象可以存儲(chǔ)一些用戶特殊信息。當(dāng)用戶在該應(yīng)用程序的不同頁(yè)之間跳轉(zhuǎn),存放在session中的變量不會(huì)丟失,相反,這些變量在整個(gè)用戶過(guò)程中一直保留。當(dāng)一個(gè)頁(yè)面被一個(gè)未有session的用戶請(qǐng)求時(shí),web服務(wù)器會(huì)自動(dòng)建立一個(gè)session對(duì)象。當(dāng)session的時(shí)間限制到了或是被中斷了時(shí),服務(wù)器就會(huì)撤消session對(duì)象。為了避免這種情況,你可以把session屬性關(guān)閉。然而在iis3.0中在每個(gè)應(yīng)用中的session屬性不能關(guān)閉。把整個(gè)服務(wù)器中的session關(guān)閉速度會(huì)快一些,但這樣會(huì)損失很多功能。最好是需要時(shí)謹(jǐn)慎使用session對(duì)像 當(dāng)你在整個(gè)應(yīng)用中都用到session對(duì)像時(shí),注意要快點(diǎn)用,否則session對(duì)像將會(huì)被重置。在iis4.0中,每個(gè)應(yīng)用基礎(chǔ)中的session狀態(tài)都可以被激活,也可以在specified.asp文件中被取消。 *技巧15:做性能測(cè)試 該文章在 2011/2/16 10:31:29 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |