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

首頁 > 開發(fā) > 綜合 > 正文

VBScript - JScript:誰怕誰?

2024-07-21 02:15:36
字體:
供稿:網(wǎng)友
導(dǎo)讀     
  在asp環(huán)境下,vbscript和jscript哪種語言更好一些?本文測試這兩種腳本語言完成常見操作所需要的時間,分析它們各自的長處和不足,并根據(jù)測試結(jié)果得出了一些值得關(guān)注的結(jié)論。
作者:仙人掌工作室 2000-12-19
   原文出處:http://www.asptoday.com/articles/20000920.htm
   選擇方案體系需要考慮許多因素,往往關(guān)系到基于性能、容量、可維護(hù)性、職員經(jīng)驗、現(xiàn)有基礎(chǔ)、個人愛好的成本優(yōu)勢分析。在典型的microsoft/iis實現(xiàn)中,這種考慮將繼續(xù)深入擴(kuò)展到asp與大量不同的com+組件協(xié)作時所擔(dān)當(dāng)?shù)慕巧涸谝粋€極端,注重性能遠(yuǎn)遠(yuǎn)超過編程和維護(hù)的方便程度,asp只作為整合業(yè)務(wù)邏輯和用戶界面的“粘合劑”;在另一個極端,注重編程和維護(hù)的方便程度超過性能,asp本身用于實現(xiàn)許多業(yè)務(wù)邏輯。
   這種考慮甚至還可以繼續(xù)深入一步,分析asp的兩種主要腳本語言(vbscript和jscript)相對而言各有哪些優(yōu)缺點。從功能上看,贊成jscript的人可以說jscript提供了諸如更好的錯誤控制、繼承、位操作以及一種客戶端、服務(wù)器端基本通用的腳本語言等優(yōu)點;反過來,贊成vbscript的人可以說vbscript也有自己的特點,如極其豐富的本地化能力,大小寫無關(guān)的代碼,更加簡單直觀的語法(當(dāng)然,c程序員對這一點會有異議)。極端地說,我們不僅可以達(dá)到這樣一個在同一網(wǎng)站不同asp頁面上分析兩種語言各自優(yōu)點的深度,而且在單個asp頁面之內(nèi)也是如此!
   雖然有時在同一asp頁面內(nèi)使用多種腳本語言能夠簡化編程,但它對性能不利。只需粗略地考慮一下這個問題,我們就知道運(yùn)行這種asp頁面需要啟動并緩存兩個腳本引擎,極大地增加了開銷。(而且,即使我們可以忽略性能問題,混合運(yùn)用兩種腳本語言本身就是不安全的,這是因為引擎緩沖機(jī)制將影響執(zhí)行順序。簡而言之,如果開發(fā)者不小心的話,使用二個或以上腳本引擎的asp頁面可能不會順序地執(zhí)行。)
   本文所要深入研究的就是這個windows 2000 / asp3.0平臺上vbscript對比jscript(以及vbscript加jscript)的性能問題。具體地說,本文將回答下列問題:
是否其中一種腳本語言要比另外一種快一點?
如果是,是在哪種情形之下以及為什么?
是否存在混合使用兩種腳本語言可以減少執(zhí)行時間的情形?(這種情形是否具有現(xiàn)實意義?)
如果某種語言總是比另外一種要快,兩者速度差異的大小是否足以成為選擇腳本語言的考慮因素?
   為回答這些問題,我們將比較8個典型例程的執(zhí)行時間,這些例程用vbscript、jscript以及兩者結(jié)合編寫(兩者結(jié)合是指,一種腳本語言作為asp頁面的主要語言(基本語言),由它來調(diào)用另一種腳本語言編寫的內(nèi)嵌函數(shù))。這8個例程是:
字符串翻轉(zhuǎn)(顛倒),
在一個字符串內(nèi)搜索另一個字符串,
正則表達(dá)式模式匹配,
位移操作,
簡單數(shù)學(xué)計算,
復(fù)雜數(shù)學(xué)計算,
數(shù)組初始化,
ado記錄集遍歷。
   分析方法
   鑒于影響web應(yīng)用性能的因素是如此眾多,而且真正困難的可能還在于配置出一個完全受控制的(也叫做“不現(xiàn)實的”)測試環(huán)境,本文的目的不是給出兩種語言性能比較而言其差異的精確測度,而是給出各種編程方案下性能相對優(yōu)勢的可靠指示。
   這就是說,我們的目標(biāo)不是為了知道jscript的正則表達(dá)式模式匹配操作要比vbscript的快23%,我們主要關(guān)心的是:是否存在這種差異,這種差異一般有多少明顯,在什么樣的情況下存在這種差異,以及為何會如此。
   本文只給出匯總(平均)數(shù)據(jù)。如果要查看更具體的數(shù)據(jù),可以在data.xls找到原始的測試結(jié)果。data.xls可以從本文后面下載。
   測試是在一個桌面系統(tǒng)上進(jìn)行,配置為:400mhz celeron處理器,128 mb ram,操作系統(tǒng)是windows 2000 server (5.00.2195),web服務(wù)器是運(yùn)行asp 3.0 (asp.dll 5.0.2180.1)的iis 5.0.2157.1。腳本引擎(jscript和vbscript)的版本是5.1.0.4615。測試期間系統(tǒng)所運(yùn)行的服務(wù)減小到最小數(shù)量,而且為盡可能地保證測試環(huán)境的穩(wěn)定性,這個最小數(shù)量一直保持不變。
   此外,考慮到iis的默認(rèn)腳本引擎設(shè)置可能造成測試結(jié)果的偏差,許多測試在兩種可能的默認(rèn)腳本引擎設(shè)置下進(jìn)行。在所有測試過的方案中,該因素均不影響執(zhí)行時間的先后和執(zhí)行結(jié)果差異的大小。
   測試工具
   兩個測試用的工具頁面分別用vbscript(default.asp)和jscript(default-js.asp)編寫。這兩個頁面具有同樣的功能:讓測試者選擇一個asp頁面并指定執(zhí)行該頁面的次數(shù),記錄精確到千分之一秒的累計執(zhí)行時間(見下圖)。(被執(zhí)行頁面由測試工具頁面的server.execute調(diào)用)。

  


                     【圖1】
   同樣,考慮到腳本引擎的初始化操作可能影響被調(diào)用頁面的執(zhí)行時間,許多測試方案都分別用兩個測試工具頁面在不同的iis默認(rèn)腳本引擎設(shè)置下進(jìn)行了測試。和前面一樣,在所有測試過的方案中該因素均不影響執(zhí)行時間的先后和執(zhí)行結(jié)果差異的大小。(然而,對于測試記錄來說,即使iis的默認(rèn)腳本引擎設(shè)置成了jscript,用vbscript寫的測試工具頁面還是要比用jscript寫的測試工具頁面稍微快一點)。
   性能度量標(biāo)準(zhǔn)
   本文測試的性能度量標(biāo)準(zhǔn)是執(zhí)行時間。執(zhí)行時間四舍五入到最接近的毫秒值。如果測試工具頁面多次執(zhí)行測試頁面(例如1000次的server.execute調(diào)用),執(zhí)行時間起始位置在包圍測試頁面調(diào)用的“for loop”循環(huán)之前,執(zhí)行時間的結(jié)束位置在循環(huán)結(jié)束后。
   基于vbscript的測試工具頁面用timer()函數(shù)計算執(zhí)行時間,基于jscript的測試工具頁面用jscript的date對象計算執(zhí)行時間。
我們選擇了八個不同的測試?yán)蹋ㄋ袦y試用到的代碼已經(jīng)在本文后面的下載zip文件中提供)。如果語言本身不具備某個方法或函數(shù),則編寫一個專用的方法。
   1.字符串翻轉(zhuǎn):進(jìn)行這個測試不僅是因為它是一個很有代表性的操作,而且因為vbscript提供了內(nèi)建的strreverse()函數(shù)而jscript卻沒有等價的函數(shù)或方法。這為我們提供了一個很好的混合語言編程測試案例。本測試中被翻轉(zhuǎn)的字符串是“string reversal”。
   2.在一個字符串中搜索另一個字符串:vbscript和jscript本身都提供實現(xiàn)該任務(wù)的方法。我們用vbscript的instr()函數(shù)和jscript的indexof()方法在字符串“this is a sentence written for the sake of writing a sentence.”中查找字符串“ke”的起始位置。
   3.正則表達(dá)式模式匹配:雖然vbscript最近才加入了正則表達(dá)式支持,但這仍舊是一個很好的比較測試案例。jscript提供各種各樣能夠接受模式的string對象方法,使我們能夠更靈活地進(jìn)行處理;而vbscript沒有這么靈活,必須在regexp對象所界定的范圍內(nèi)進(jìn)行。測試頁面包含一個函數(shù),這個函數(shù)接受字符串“regular expression pattern match”以及正則表達(dá)式“/(eg)|y|t{2,}/”,并返回匹配總次數(shù)。
   4.位移操作:jscript有位操作符而vbscript沒有,這又是一個很好的比較測試案例。在進(jìn)行這個測試的頁面中將進(jìn)行下列操作:97 < < 5 以及 -14 > > 2。
   5.簡單數(shù)學(xué)計算:進(jìn)行以下計算:18976.6754 + (-908.6) + 1475.211。
   6.復(fù)雜數(shù)學(xué)計算:測試頁面包含這樣一個函數(shù),它根據(jù)兩個點的坐標(biāo)計算出它們之間的距離(英里)。vbscript的計算表達(dá)式為:

  distance = round(sqr(((69.1 *(lata-latb))^2) +       ((69.1 * (abs(lnga)-abs(lngb)) * cos(latb/57.3))^2)),1).

   7.?dāng)?shù)組初始化:只要出現(xiàn)對數(shù)組元素的訪問,vbscript和jscript引擎都將創(chuàng)建整個數(shù)組的臨時拷貝,這也是一個很好的測試案例。另外,jscript的數(shù)組同時也是帶有許多方法和屬性的對象,而vbscript中數(shù)組只是一個數(shù)組。這個測試通過for循環(huán)初始化一個有100,000個元素的數(shù)組,每個元素都被賦予循環(huán)計數(shù)器的值。
   8.a(chǎn)do記錄集遍歷:這個測試使用的數(shù)據(jù)庫是access2000的“northwind”數(shù)據(jù)庫,程序通過ado連接對象執(zhí)行“select * from orders”命令獲得一個ado記錄集。程序利用兩個嵌套的循環(huán):外部循環(huán)遍歷記錄,內(nèi)部循環(huán)遍歷每個記錄的所有字段。這個測試案例之所以好,是因為jscript需要實例化一個enumeration對象才能遍歷對象集合,而vbscript只需要一個for each ... next循環(huán)就可以完成同樣的任務(wù)。
上面的第一、三、四、六幾種算法有一個共同特點:或者是其中一種語言獨具某個功能,或者在正則表達(dá)式匹配和距離計算中,兩種語言的差別非常大,足以成為一個很有意義的混合語言編程測試項目。這就為我們測試這些算法增加了兩種方案:以vbscript作為基本語言調(diào)用內(nèi)嵌的jscript函數(shù);以jscript為基本語言調(diào)用內(nèi)嵌的vbscript函數(shù)。測試代碼舉例如下(測試方案:字符串翻轉(zhuǎn),以jscript為基本語言,vbscript內(nèi)嵌):

< %@language=jscript% > < script language="vbscript" runat="server" > function strrevvb(strparm)   strreverse(strparm)   end function < /script > < %   strrevvb("string reversal") % >

   所有其他例程都只包含語言本身提供的功能,這些例程只用純vbscript和純jscript版的代碼測試。換句話說,對于任何情形的混合語言編程合理性測

|||試來說,這些例程的價值都不大。
   第一組測試運(yùn)行前六個例程,對于每一次運(yùn)行,測試工具頁面都要進(jìn)行1000次對包含測試?yán)痰腶sp頁面的調(diào)用(server.execute)。換句話說,如果某次運(yùn)行調(diào)用了一個兩種腳本語言都編寫的頁面1000次,則調(diào)用asp引擎和各個腳本引擎的開銷都達(dá)到1000次。雖然這種方法導(dǎo)致腳本引擎的開銷影響測試結(jié)果,但我們獲得的測試結(jié)果卻更能反映出實際應(yīng)用場合的效果。也就是說,雖然我們可以在單個頁面之內(nèi)完成1000次字符串翻轉(zhuǎn)之類的操作,但更接近實際的是將這些代碼和其他代碼放入同一頁面,然后讓這個頁面執(zhí)行數(shù)千次。
   第二組測試運(yùn)行全部八個例程,每次運(yùn)行期間測試工具頁面只執(zhí)行測試頁面1次,但測試頁面本身包含循環(huán)。字符串翻轉(zhuǎn)和簡單數(shù)學(xué)計算都在它們各自的asp頁面內(nèi)運(yùn)行10,000次。模式匹配操作執(zhí)行1,000次。字符串查找、距離計算以及兩個位移操作(左移和右移)操作執(zhí)行10,000次。在數(shù)組初始化測試中,程序聲明一個100,000個元素的數(shù)組,然后通過for循環(huán)對它進(jìn)行初始化并將計數(shù)器的值賦予各個元素。在記錄集遍歷測試中,程序通過while外循環(huán)遍歷記錄集(記錄集包含830個記錄),通過for each ... next內(nèi)循環(huán)遍歷單個記錄的各個字段(每個記錄有14個字段)。
   第二組測試提供的是這樣一些方案,它們更加側(cè)重于被測試?yán)瘫旧淼膱?zhí)行開銷,從而更清楚地告訴我們兩種腳本語言在執(zhí)行時間方面的優(yōu)缺點。
第一組測試的結(jié)果如下表所示。表中的數(shù)值是在不同方案下1000次asp頁面調(diào)用的平均執(zhí)行時間,以秒計(每次執(zhí)行asp頁面時測試?yán)虉?zhí)行一次)。 方案 語言*** 字符串翻轉(zhuǎn)* 字符串查找** 正則表達(dá)式模式匹配* 位移操作* 簡單數(shù)學(xué)計算* 復(fù)雜數(shù)學(xué)計算** vb - vb 2.245 2.038 4.452 2.200 2.173 2.151 js - js 2.690 2.214 2.635 2.166 2.288 2.313 vb - js 3.522 - 3.430 3.035 - 3.178 js - vb 3.185 - 5.368 3.103 - 3.004
*運(yùn)行96次,其中:24次是vbscript測試工具頁面、iis默認(rèn)腳本語言vbscript;24次是jscript測試工具頁面、iis默認(rèn)腳本語言vbscript;24次是vbscript測試工具頁面、iis默認(rèn)腳本語言jscript;還有24次是jscript測試工具頁面、iis默認(rèn)腳本語言jscript。為了減小次序帶來的影響,第一、三、四、六測試?yán)痰姆桨杆\(yùn)行的次序每次都經(jīng)過改變。上表所顯示的時間是96次運(yùn)行的平均時間。所有細(xì)節(jié)數(shù)據(jù)都可以在下載包的data.xls文件內(nèi)找到。
**使用vbscript測試工具頁面運(yùn)行24次,iis腳本語言設(shè)置成vbscript(沒有運(yùn)行其他的測試工具頁面和默認(rèn)腳本語言的組合,因為在最初的運(yùn)行中它們沒有顯示出任何次序或時間差異上的影響)。
***vb代表vbscript,js代表jscript。兩種語言中的前一種是頁面的基本語言,第二種是內(nèi)嵌代碼所用的語言。內(nèi)嵌代碼不用于不需要使用它的場合。
   大多數(shù)測試結(jié)果的含義都非常明顯,但應(yīng)注意兩個可能令人驚奇的結(jié)果。我們知道,jscript通過string對象的方法處理正則表達(dá)式,具有更好的靈活性,而vbscript需要實例化regexp對象的開銷。但令人驚奇的是,完全用vbscript編寫的代碼比以vbscript為基本語言、用內(nèi)嵌jscript函數(shù)完成模式匹配操作的代碼要慢。顯然,實例化vbscript的regexp對象需要非常可觀的時間開銷。
   第二個令人驚奇的地方是,雖然事實證明jscript的位操作總是要比vbscirpt的快,但在這些測試中兩者的時間差異非常小。
   第二組測試的結(jié)果如下表所示。表中的數(shù)值表示不同方案下單個asp頁面的平均執(zhí)行時間,以秒計(每執(zhí)行一次asp頁面,測試?yán)踢\(yùn)行多次)。 方案 語言** 字符串翻轉(zhuǎn)(1) 字符串搜索(3) 正則表達(dá)式模式匹配(2) 位移操作(3) 簡單數(shù)學(xué)計算(1) 復(fù)雜數(shù)學(xué)計算(3) 數(shù)組初始化(1) 記錄集遍歷(4) vb - vb 0.120 0.346 2.250 0.200 0.287 0.328 2.182 0.524 js - js 2.589 0.998 0.138 0.036 0.426 0.499 9.120 0.641 vb - js 3.066 - 0.221 0.890 - 1.310 - - js - vb 0.472 - 2.363 0.769 - 0.671 - -
*每種情形用vbscript測試工具頁面運(yùn)行24次,iis的默認(rèn)腳本語言是vbscript(沒有運(yùn)行其他的測試工具頁面和iis默認(rèn)腳本語言組合,因為在最初的運(yùn)行中它們沒有顯示出任何次序或時間差異上的影響)。為了減小次序帶來的影響,第一、三、四、六測試?yán)痰姆桨杆\(yùn)行的次序每次都經(jīng)過改變。上表所顯示的是24次運(yùn)行的平均時間,所有細(xì)節(jié)數(shù)據(jù)都可以在下載包的data.xls內(nèi)找到。
**vb代表vbscript,js代表jscript。兩種語言中的前一種是頁面的基本語言,第二種是內(nèi)嵌代碼所用的語言。內(nèi)嵌代碼不用于不需要使用它的場合。
  1. 100,000 次迭代
  2. 1,000次迭代
  3. 10,000次迭代
  4. 830個記錄的外部循環(huán),14個字段的內(nèi)部循環(huán)(總共11,620次迭代)

   這些測試結(jié)果更清楚地證實了兩種語言的區(qū)別所在。從數(shù)學(xué)計算的結(jié)果可以看出,vbscript在這方面要比jscript快——除了位移操作之外(jscript本身支持位移操作,而vbscript不支持)。
   兩種語言最顯著的區(qū)別在于字符串翻轉(zhuǎn)、字符串搜索和數(shù)組初始化,所有這些測試項目中vbscript都占優(yōu)勢。
   字符串翻轉(zhuǎn)操作是vbscript本身所支持的,在該項測試中兩者差別尤其明顯。在這個測試中,兩者的差異之大使得采用內(nèi)嵌vbscript strreverse()函數(shù)也要比用jscript編寫該函數(shù)快。
   在那些數(shù)據(jù)改動非常頻繁使得手工構(gòu)造數(shù)據(jù)失去現(xiàn)實意義的應(yīng)用中,數(shù)據(jù)庫記錄集遍歷是一種相當(dāng)常見操作,因此,上述測試結(jié)果中vbscript和jscript在記錄集遍歷上的差異可能會給那些認(rèn)為jscript優(yōu)于vbscript的人一些警示。然而,這種執(zhí)行時間上的差異也可以用如下事實來辯解,即我們?yōu)橛涗浖械拿總€記錄分別實例化了一個enumerator對象(總共達(dá)到了830次!)。
   從第一組測試的結(jié)果中已經(jīng)可以看出,正則表達(dá)式模式匹配是jscript絕對優(yōu)于vbscript的一個地方,所以這一組的測試結(jié)果并不令人奇怪。這里的測試結(jié)果證實了上一組的測試結(jié)果,但差異程度有所放大。
顯然,我們可以從測試結(jié)果中得到這樣一個結(jié)論:在一個注重性能的場合,混合運(yùn)用多種腳本語言一般是沒有意義的。如果要考慮兩次模式匹配測試的結(jié)果差異,也應(yīng)該看到每次迭代都創(chuàng)建了一個regexp對象的實例。
   從這些測試結(jié)果中我們還可以得出另外兩個重要的結(jié)論。首先,如果一種語言本身支持某個功能,直接使用該功能總是要比借用另外一種語言的功能快。第二,如果一種語言以對象形式實現(xiàn)了某種功能(比如vbscript的regexp對象,jscript的array和string對象),而第二種語言有更加基本的實現(xiàn),則第二種語言在這方面速度較快。顯然,創(chuàng)建對象實例的代價是相當(dāng)高的。
   其它測試結(jié)果也顯示出這一點。然而,這是否也證明:jscript作為一種更廣泛地使用對象以及支持繼承的語言,它必然要比vbscript慢?
   并不一定。如果我們是在實現(xiàn)一個n-層體系,復(fù)雜的業(yè)務(wù)邏輯總是被封裝到組件里,asp頁面的腳本更主要地是提供整合業(yè)務(wù)對象和前端界面的“粘合劑”支持。換句話說,我們不太會過多地依賴于腳本本身或由腳本提供的對象。
   然而在有些場合我們卻不能不用對象。以數(shù)組為例,無論是在vbscript還是jscript中,只要出現(xiàn)對數(shù)組元素的引用,內(nèi)存中就要復(fù)制一個完整的數(shù)組。對于jscript來說,這意味著還要復(fù)制數(shù)組對象的全部屬性。因此,如果程序大量地引用數(shù)組元素,使用jscript的代價顯然比較高。
   附注
   我們應(yīng)該還不會忘記第一輪的測試。這些案例往往不是在一個頁面里運(yùn)行數(shù)千次,而是單獨地被調(diào)用數(shù)千次,此時執(zhí)行時間上的差異就顯得不那么明顯。
   這樣,下面這個理由可能會使我們草率地放棄本文的測試結(jié)果:如果性能很重要,那么我們就應(yīng)該利用com+所提供的對象池和二進(jìn)制代碼等優(yōu)點,由此我們獲得的好處將遠(yuǎn)遠(yuǎn)超過能夠從一種腳本語言對于另一種腳本語言的優(yōu)勢之中獲得的。如果我們可以認(rèn)為方案體系的決策是一個性能(com+)和編碼/維護(hù)的方便性(腳本語言)之中二者擇一的命題,那么這個理由確實是合理的。
   但在現(xiàn)實中不可能有無數(shù)的開發(fā)者擁有無限的技能,這一事實造成了上述兩個極端之間根據(jù)歷史條件、職員情況、開發(fā)時間等因素所作出的許多折衷和平衡。然而,在一些場合排除使用com+并不意味著完全不再關(guān)注性能問題。如果由于某些原因com+不適用,那么本文所提供的測試結(jié)果必將有助于您的決策。
   請從這里下載本文代碼:http://www.asptoday.com/articles/images/20000920.zip
 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汶川县| 宁远县| 平远县| 永康市| 岗巴县| 抚顺县| 河北省| 龙井市| 德兴市| 依兰县| 衡山县| 无锡市| 虞城县| 二连浩特市| 贵德县| 故城县| 岳阳县| 海口市| 巩留县| 玛多县| 合阳县| 青田县| 舒城县| 尼玛县| 洪江市| 谷城县| 菏泽市| 和顺县| 建阳市| 武乡县| 错那县| 万源市| 通州区| 营山县| 沁源县| 昭平县| 于田县| 台中县| 怀安县| 克山县| 临夏县|