VBscript中:谁怕谁
在ASP环境,其语言是VBscript和Jscript更好吗本文测试了这两种脚本语言完成共同操作所需的时间,分析了各自的优缺点,并根据测试结果得出了一些值得注意的结论。
作者:仙人掌工作室2000-12-19
原文来源:
许多因素需要在选择方案的系统考虑,这往往是成本优势的基础上,分析相关的能力,可维护性,员工的经验、现有基础和个人利益。在一个典型的微软IIS实现,这种考虑将继续发挥进一步扩展到ASP与大量的COM +协调角色不同的组件:在一个极端,远远超过了以绩效为导向的编程和维护方便,ASP作为业务逻辑和用户界面粘结的整合;在另一个极端。注意ASP本身对许多业务逻辑的编程和方便维护性能。
这方面的考虑,甚至可以走的更远,并分析其优点和缺点,ASP的两个主要的脚本语言(VBscript和Jscript)。从功能上看,在一个支持Jscript可以说Jscript提供了更好的误差控制,如继承、操作和客户端和服务器的基本通用的脚本语言和其他优势;反过来,在VBscript的人赞成可以说语言也有其自身的特点,如丰富的定位能力,不区分大小写的代码更简单和直观的语法(当然,C程序员都反对这一点)。在极端的条件,我们不仅可以实现这样一个深入的分析,对同样的ASP页面两种语言的优点,但也在单个ASP页面中。
虽然有时使用多种脚本语言在同一个ASP页面可以简化编程,性能不好。把这个问题一个粗略的看,我们知道这需要开始运行ASP页面缓存两种脚本引擎,这大大增加了开销。而且,即使我们可以忽略的性能问题,它是不安全的混合两种脚本语言,这是因为发动机的缓冲机制会影响执行顺序。总之,如果开发商是粗心,ASP页面使用两个或两个以上的脚本引擎可能不按顺序执行。
本文将深入到VBscript此Windows 2000 / ASP3.0平台相比,性能问题(Jscript和VBscript和Jscript)。具体地说,本文将回答以下问题:
脚本语言的速度比其他语言快一点吗
如果是,在什么情况下,为什么
有两种脚本语言的组合,可以减少执行时间吗(这种情况有实际意义吗)
如果一种语言总是比另一种语言快,那么速度差异的大小是否足以成为选择脚本语言的一个因素
为了回答这些问题,我们将比较8种典型的程序执行时,这些程序写的VBscript,Jscript和他们(都指的是一种脚本语言为ASP页面的主要语言(BASIC语言),由它来调用另一个脚本内联函数)。这8个例程:
字符串翻转(倒置),
在一个字符串中搜索另一个字符串,
正则表达式模式匹配,
移位操作,
简单数学计算,
复杂数学计算,
数组的初始化,
ADO记录集是穿越。
分析方法
在Web应用程序的性能的影响因素很多,但真正的困难可能是在一个完全控制配置(也叫不现实)的测试环境,本文的目的不是要准确衡量性能相比,两种语言的差异,是各种规划方案的性能可靠的指示是优势。
也就是说,我们的目标是不知道正则表达式模式匹配操作Jscript要比23% VBscript更快,我们主要关心的是是否这些差异,这些差异通常是明显的,这些在什么样的环境差异,以及为什么。
本文仅简要(平均值)的数据。如果你想看更具体的数据,你可以在data.xls.data.xls找到原来的测试结果可以从本文末尾的下载。
进行测试,在桌面系统,配置为:400mhz赛扬处理器,128 MB内存,操作系统为Windows 2000 Server(5.00.2195),Web服务器的ASP 3运行asp.dll 3。脚本引擎版本的(Jscript和VBscript)是5.1.0.4615.during测试期间,系统运行服务减少到最低限度,以保证测试环境的稳定性,尽可能的最小数目保持不变。
此外,考虑到IIS的默认脚本引擎设置可能会导致测试结果的偏差,许多测试都是在两种可能的默认脚本引擎设置下进行的,在所有测试方案中,这个因素不影响执行时间的大小和执行结果之间的差异。
测试工具
两个测试工具页面是用VBscript和Jscript(默认。ASP)(默认的JS,ASP)分别。两页具有相同的功能:让测试者选择一个ASP页面和指定执行页面的次数,并记录累计执行时间正好是1 / 1000秒(见下文)。(执行页面被服务器执行测试工具页)。
U3000 U3000
{图1 }
同样,考虑到脚本引擎初始化操作可能会影响调用页面执行时间,许多测试方案与测试工具页面两不同IIS默认脚本引擎的设置下进行测试。之前,这个因素不影响执行时间的大小,在所有的测试计划执行结果的差异然而,测试记录,即使IIS默认脚本引擎设置为Jscript,测试工具用VBscript页仍比测试工具编写的网页快一点。
性能指标
这个测试的性能指标,执行时间,执行时间是四和五最近的毫秒值。如果测试工具页面执行测试网页多次(例如,1000个时间服务器,执行调用),执行时间的循环是由测试页开始,和执行时间结束循环结束时。
基于测试工具页面计算执行时间与定时器VBscript()函数。Jscript基于测试工具页面执行时间的计算与Jscript对象。
我们选择了八种不同的测试例程(用于本文后面下载ZIP文件中已经提供的所有测试的代码)。如果语言本身没有方法或函数,则编写一个特殊的方法。
1。字符串反转:这个测试不仅是因为它是一个典型的操作,但也因为VBscript提供了内置StrReverse()函数,但Jscript没有等效的函数或方法。这为我们提供了一个良好的混合语言编程的测试案例。翻转字符串测试字符串反转。
2。在一个字符串中搜索另一个字符串:两VBscript和Jscript本身提供了一种方法来完成这项任务。我们使用的仪器()函数VBscript和indexOf()查找字符串在字符串,这是一个句子的书面的起始位置的Jscript方法。
三.正则表达式模式匹配:虽然VBscript最近加入了正则表达式的支持,它仍然是一个比较好的测试case.jscript提供各种字符串对象的方法可以接受的模式,使我们能更灵活地处理他们。VBscript不是那么灵活,且必须在通过RegExp对象定义的范围定义,测试页面包含一个函数,这个函数接受的正则表达式匹配的字符串和正则表达式/(EG)| Y | T { 2 } /,并返回总人数的匹配。
4。移位操作:Jscript有点算子和VBscript不,这是一个比较好的测试案例。下面的操作将被执行在网页测试:97>2。
5。简单的数学计算:以下计算:18976.6754 +(- 908.6)+ 1475.211。
6。复杂的数学计算:测试页面包含这样一个函数,计算它们之间的距离(英里)根据两点坐标计算表达式的VBscript:
距离=圆((((((((( 69.1 *(*(Lata LATB))^ 2)+((69.1 *(ABS(lnga)ABS(LNGB))* cos(LATB / 57.3))^ 2))))。)。)。
7、数组的初始化:只要有访问数组元素,VBscript和Jscript引擎会创建一个整个阵列的临时副本,这也是一个很好的测试案例。此外,Jscript数组也有许多方法和属性的对象,并在VBscript数组是数组。这个测试初始化100000个元素的数组通过for循环,其中每个给定的循环计数器的值。
8.ado记录集的遍历:本试验采用数据库Access2000的Northwind数据库,和程序执行的选择,从订单命令通过ADO连接对象来获取一个ADO记录集。程序使用了两个嵌套的循环:外部循环遍历记录,和内循环遍历每个记录的所有字段的。为什么这个测试用例是好是,Jscript需要实例化一个枚举对象遍历对象集合,和VBscript只需要一个…完成相同任务的下一个循环。
上述第一、第三、第四、六的算法有一个共同的特点:或是一个与匹配功能的语言,或者在距离计算正则表达式的两种语言,差别非常大,足以成为一个非常有意义的混合语言编程的测试项目。这将增加我们测试这些算法的两种方法:调用Jscript函数嵌入VBscript的基本语言,并调用Jscript中嵌入VBscript函数。测试代码示例如下(测试方案:字符串翻转,Jscript作为基本语言,VBscript嵌入):
StrRevVB(strparm StrReverse函数)(strparm)端功能
所有其他例程只包含由语言本身提供的功能,只使用纯VBscript和Jscript代码测试纯版本。换句话说,这些例程的混合语言编程的合理性测试,在任何情况下都是没有价值的。
第一组在运行前测试六个例程。对于每一个操作,测试工具页面必须包含测试例程的ASP网页1000电话(服务器执行)。换句话说,如果一个操作调用一个页面的1000次两脚本语言来编写,成本调用ASP引擎和脚本引擎的1000倍。虽然这种方法的原因该脚本引擎的成本影响测试的结果,我们得到的结果可以反映实际应用的效果。也就是说,虽然我们可以在一个单一的页面执行1000字符串反转操作,这是更实际的把这些代码和其它代码到相同的页面,然后让页面执行数千次。
第二组测试运行所有八个例程。在每次运行中,测试工具页面只执行测试页面的1倍,但测试页面本身包含了一个循环。字符串翻转和简单的数学计算运行10000次在各自的ASP页。模式匹配操作执行了1000次。字符串的查找,计算距离和两个位移操作(左、右)操作10000次。在数组的初始化测试,程序声明了100000个元素的数组,然后将它初始化为环,并给出了各元件的计数器的值,记录集的遍历测试,程序遍历记录集通过外回路的同时(记录集包含830条记录),并穿越一个记录的每个字段通过T他为每个…下一个内部循环(每个记录有14个字段)。
第二组测试提供了这样的方案,这些方案更多地关注测试例程本身的执行开销,从而使我们更清楚地了解这两种脚本语言在执行时间方面的优缺点。
第一组测试的结果显示在下表中,表中的值是1000个ASP页面调用在不同方案下的平均执行时间,以秒为单位(每次ASP页面执行时,测试例程被执行一次)。
计划
语言***
字符串翻转*
字符串的查找
正则表达式模式匹配*
移位操作*
简单的数学计算*
复杂数学计算**
VB VB
二点二四五
二点零三八
四点四五二
二点二零零
二点一七三
二点一五一
JS JS
二点六九零
二点二一四
二点六三五
二点一六六
二点二八八
二点三一三
VB的JS
三点五二二
—
三点四三零
三点零三五
—
三点一七八
JS VB
三点一八五
—
五点三六八
三点一零三
—
三点零零四
*运行96次,其中:24是VBscript网页的测试工具,IIS默认脚本语言VBscript;24是Jscript网页的测试工具,IIS默认脚本语言VBscript;24是VBscript网页的测试工具,IIS默认脚本语言Jscript;24 Jscript测试工具页面,IIS默认Jscript脚本语言。为了减少订单的影响,第一,为第三,第四和六的测试例程,每次更改。上表所显示的时间是96运行的平均时间。所有的细节都可以在下载包的data.xls文件中找到。
* VBscript测试工具页面运行24次,和IIS脚本语言为VBscript。没有其他测试工具页面和默认脚本语言的组合,因为它们在初始操作中没有显示任何顺序或时间差异。
*** VB是VBscript和Jscript,JS代表。这两种语言的首先是网页的基本语言,第二是用于嵌入式代码的语言。嵌入式代码不使用的情况下,不需要使用它。
大多数试验结果的意义是非常明显的,但两个令人惊讶的结果值得重视。我们知道可以通过Jscript处理正则表达式的字符串对象,它具有更好的灵活性,而VBscript需要实例化RegExp对象的成本。但令人惊讶的是,这是完全在VBscript编写的代码比基于VBscript语言和嵌入Jscript函数慢。显然,VBscript的RegExp对象实例化需要相当的时间开销。
第二,令人惊讶的是,尽管Jscript位操作总是比vbscirpt,它们之间的时间差很小。
第二组测试结果显示在下表中,表中的值代表单个ASP页面在不同方案下的平均执行时间,以秒为单位(每次执行ASP页面时,测试例程运行多次)。
计划
语言***
字符串翻转(1)
字符串搜索(3)
正则表达式模式匹配(2)
置换操作(3)
简单数学计算(1)
复杂数学计算(3)
数组初始化(1)
记录集的遍历(4)
VB VB
零点一二零
零点三四六
二点二五零
零点二零零
零点二八七
零点三二八
二点一八二
零点五二四
JS JS
二点五八九
零点九九八
零点一三八
零点零三六
零点四二六
零点四九九
九点一二零
零点六四一
VB的JS
三点零六六
—
零点二二一
零点八九零
—
一点三一零
—
—
JS VB
零点四七二
—
二点三六三
零点七六九
—
零点六七一
—
—
*每个情况与VBscript测试工具页面运行24次,IIS默认的脚本语言是VBscript(没有运行其他测试工具页面,IIS默认脚本语言组合,因为在初始运行出现任何顺序或时间差没有影响)。为了减少订单的影响,第一,以第三,第四和六的测试例程,每次更改。上表显示为24运行的平均时间,以及所有的细节可以在下载包的data.xls发现。
* VB是VBscript和Jscript,JS代表。这两种语言的首先是网页的基本语言,第二是用于嵌入式代码的语言。嵌入式代码不使用的情况下,不需要使用它。
100000迭代
1000迭代
10000迭代
830个记录的外部循环,14个字段的内部循环(总共11620次迭代)
这些测试的结果清楚地确认两种语言之间的差异,从数学计算的结果,我们可以看到,VBscript比除了位移操作Jscript更快(Jscript本身支持位移操作,而VBscript不支持)。
这两种语言之间的差异最显着的是字符串翻转,字符串搜索,和数组的初始化,所有这些测试项目有VBscript的优势。
字符串翻转操作由VBscript本身的支持,以及两者之间的区别是特别明显的测试。在这个测试中,镶嵌的VBscript StrReverse()函数也更快的差异的大使比用Jscript编写函数。
在这些数据的变化是频繁使用使数据手册建设数据库中的记录集的遍历失去实际意义是一种比较常见的操作,因此,在设置遍历记录的VBscript和Jscript的测试结果可能会有所差异,Jscript优于VBscript的人的一个警告。然而,在执行时间的差异也可以由以下事实解释说:我们已经实现了每个记录的枚举器对象在记录集(共830次!)。
从第一组测试结果中,我们可以看到,正则表达式模式匹配是一个地方,Jscript是VBscript的绝对优势,所以这一组的测试结果并不令人惊讶。这里的试验结果证实了以前的研究组,但差异被放大。
显然,从试验结果中可以得出一个结论:在一个面向性能的场合,它通常是混合多种脚本语言毫无意义。如果你想在两模式匹配试验结果的差异,你也应该看到,每次迭代产生一个RegExp对象的实例。
我们也可以从这些测试的结果得出两个重要结论:第一,如果一种语言本身支持的功能,它总是以更快的速度比使用功能直接借用其他语言。其次,如果一种语言以对象的形式实现了一些功能,如VBscript的RegExp对象,Jscript的数组和字符串对象,第二语言有更多的基本实现,第二语言将在这方面更快。显然,创建对象实例的成本是很高的。
其他的测试结果也表明这一点。这是否证明,然而,Jscript,作为一个更广泛的应用对象和一个支持继承的语言,必然要慢于VBscript
不一定,如果我们在执行一个N级系统,复杂的业务逻辑总是封装在组件中。ASP页面的脚本主要提供了集成业务对象和前端接口的粘合剂支持,也就是说,我们不太依赖脚本本身或脚本提供的对象。
在某些情况下,但是,我们不能使用对象,数组,例如,在VBscript和Jscript,完整的数组元素将被复制在内存中只要对数组元素的引用出现。Jscript,这意味着复制数组对象的所有属性。因此,如果数组中的元素是在大量的程序引用,使用Jscript的成本明显较高。
注释
我们不应忘记第一轮测试,这些案例通常不会在页面上运行数千次,而是逐个调用数千次,所以执行时间的差异并不那么明显。
所以,原因可能使我们匆忙放弃的结果:如果性能是非常重要的,所以我们应该好好利用COM+的对象池和二进制代码提供的,所以我们得到的好处将远远超过从一个脚本语言,另一个脚本语言优势获得。如果我们可以认为,程序系统的决策是一个性能的命题(COM+)和两种命题编码/维护方便(脚本语言),这个原因确实是合理的。
但实际上,无数开发者不可能拥有无限的技能。This fact causes many trade-offs and balances between the above two extremes based on historical conditions, staff status and development time.However, the exclusion of COM+ on some occasions does not mean that the performance problem is no longer concerned.If COM+ is not applicable for some reason, the test results provided in this article will certainly help your decision.