vbs的字符串操作效率分析总结

可vbs根本就没有类似于StringBuilder这样的东东,所以咱哥们只能自己想办法优化了。
正文:
我写了几段代码做了测试,得出以下结果:
'普通字符串连接
StringLinkTest1() '性能最差,大约耗时20秒(最要命的是在这20秒内,整个CPU几乎是100%满负荷在运行)
'普通字符串连接,但使用了临时变量来提升效率
StringLinkTest2() '性能令人吃惊的改善,大约耗时0.2秒
'使用数组+Join函数处理
StringArrayTest() '性能最佳,大约耗时0.06秒
'本来还有个方法,是利用字典对象:Scripting.Dictionary 来操作的,但由于在大量连续使用的类方法的情况下,会直接影响效率(效率介于StringArrayTest和StringLinkTest2之间),在此就不贴了
得出的结果就是,在vbs的字符串处理上,还是可以解决效率问题的。
代码如下:


代码如下:

<%
'vbs版高速字符串操作代码演示
'淮南子编写
Option explicit
Dim StrTime,EndTime
Dim MyString,MyArray,ArrayIndexCount,CurIndex
Const TestNumber = 9999 '循环次数
StrTime = Timer()
'============测试开始============
'代码执行效率
'本人机器配置:
'CPU: 酷睿双核2250 CPU频率:1.73G
'内存: 1GB
'请逐一开启方法进行测试
'StringLinkTest1() '性能最差,大约耗时20秒
'StringLinkTest2() '性能大大改善,大约耗时0.2秒
'StringArrayTest() '性能最佳,大约耗时0.06秒
'============测试结束============
'输出结果
'Response.Write MyString
EndTime = Timer()
Response.Write "耗时:" & FormatNumber((EndTime-StrTime) * 1000,3) & " 毫秒"
'字符串操作函数,淮南子原创
Sub Add(Value)
If (CurIndex >= ArrayIndexCount) Then
ArrayIndexCount = CurIndex * 1.1 '如果欲添加项超出数组下标,则将数组容量扩增百分之10
ReDim Preserve MyArray(ArrayIndexCount)
End If
MyArray(CurIndex) = Value
CurIndex = CurIndex + 1
End Sub
'测试方法
'使用数组进行字符串叠加,在所有方法中,该方法性能最佳(效率较StringLinkTest2()的方法提升了近4倍)
Sub StringArrayTest()
ArrayIndexCount = 20
CurIndex = 0
ReDim MyArray(ArrayIndexCount)
Dim i
For i = 0 to TestNumber
Add "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Next
MyString = Join(MyArray,"")
End Sub
'测试方法1
'常规的字符串连接
Sub StringLinkTest1()
Dim i,str
dim a1
a1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
For i=0 to TestNumber
'常规字符串连接
Str=(Str&a1)
Next
MyString = Str
End Sub
'测试方法2
'在常规的字符串连接方式中,使用临时变量来提速 ,效率较StringLinkTest1()的方法提升了近100倍
Sub StringLinkTest2()
Dim i,str,a1,TmpString
a1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
For i=0 to TestNumber
'使用临时变量提速
TmpString = (TmpString & a1)
'每二百次则进行一次累计
If i mod 200 = 0 Then
'保存临时变量值
Str = (Str & TmpString)
'清空临时变量值
TmpString = ""
End If
Next
if TmpString<>"" Then MyString = (Str & TmpString)
End Sub
%>

如有不对之处,请大家拍拍砖,呵呵
也可以用数组来拼接字符串啦!


代码如下:

'最简单的例子,生成num个重复的str,例如 XString(5,"<br>") '输出: <br><br><br><br><br>
Function XString(num,str)
On Error Resume Next
Dim i,a
Redim a(num-1)
For i=0 To num-1
a(i)=str
Next
XString=Join(a,"")
On Error GoTo 0
End Function

'字符串拼接类公共版
Class clsStrCat
Private aFStrings()
Private iFSPos,iFSLen,iFSIncr
Private Sub Class_Initialize()
On Error Resume Next
iFSIncr = STRCATBUF
If Err Then iFSIncr = 200 : Err.Clear
Reset
On Error GoTo 0
End Sub
Private Sub Class_Terminate()
Erase aFStrings
End Sub
Public Property Let Item(ByRef sData)
If iFSPos > iFSLen Then
iFSLen = iFSPos + iFSIncr
ReDim Preserve aFStrings(iFSLen)
End If
aFStrings(iFSPos) = sData
iFSPos = iFSPos + 1
End Property
Public Default Property Get Item()
Item = Join(aFStrings, "")
End Property
Public Sub Reset()
iFSPos = 0
iFSLen = iFSIncr
ReDim aFStrings(iFSLen)
End Sub
Public Sub Resize(n)
If Not IsNumeric(n) Then Exit Sub
iFSPos = 0
iFSIncr = n
iFSLen = iFSIncr
ReDim aFStrings(iFSLen)
End Sub
Public Property Get Strs()
Strs=aFStrings
End Property
Public Property Get Count()
Count=iFSPos
End Property
Public Property Get IsInit()
If iFSPos=0 Then IsInit=True Else IsInit=False
End Property
End Class

(0)

相关推荐

  • vbs的字符串操作效率分析总结

    可vbs根本就没有类似于StringBuilder这样的东东,所以咱哥们只能自己想办法优化了.正文: 我写了几段代码做了测试,得出以下结果: '普通字符串连接 StringLinkTest1() '性能最差,大约耗时20秒(最要命的是在这20秒内,整个CPU几乎是100%满负荷在运行) '普通字符串连接,但使用了临时变量来提升效率 StringLinkTest2() '性能令人吃惊的改善,大约耗时0.2秒 '使用数组+Join函数处理 StringArrayTest() '性能最佳,大约耗时0.

  • VBS脚本病毒原理分析与防范

    网络的流行,让我们的世界变得更加美好,但它也有让人不愉快的时候.当您收到一封主题为"I Love You"的邮件,用兴奋得几乎快发抖的鼠标去点击附件的时候:当您浏览一个信任的网站之后,发现打开每个文件夹的速度非常慢的时候,您是否察觉病毒已经闯进了您的世界呢?2000年5月4日欧美爆发的"爱虫"网络蠕虫病毒.由于通过电子邮件系统传播,爱虫病毒在短短几天内狂袭全球数百万计的电脑.微软.Intel等在内的众多大型企业网络系统瘫痪,全球经济损失达几十亿美元.而去年爆发的新欢

  • VBS.Runauto脚本病毒分析篇

    最近一位同事的笔记本遭遇了这个病毒,正好这学期在给计算机专业的同学们上VBscript于是顺便分析了一下. 首先从染病毒的计算机上提取下来病毒样本,由于是临时发现的,也没有特别准备,就用winrar压缩后保存. 在实验机器上打开病毒样本的压缩文件,我的Symantec 11立即报警,并把病毒删除了.所以必须禁用杀毒软件或者设置一个"例外区域"用于分析病毒,于是在桌面上新建了"evA"文件夹,并将之设置为防病毒例外文件夹,这下病毒样本安静的躺在里面了. 脚本病毒是解释

  • C#处理Json字符串实例分析

    Json字符串对于做web应用的应该很熟悉,其实在很多请求我们返回的都是Json字符串.那对于C#代码如何处理Json字符串呢,.Net封装了一个类叫做JavaScriptSerializer[MSDN Library 链接http://msdn.microsoft.com/en-us/library/ee191864(v=vs.110).aspx]:这个类提供了一个方法. 下面这个是我在快递100往抓取的一个圆通的快递信息.对于我们有用的信息是快递时间,快递状况.那我该如何来做. 复制代码 代

  • VBS的字符串及日期操作相关函数

    1. Asc(x),Chr(x):转换字符,字符码 2. Filter:搜寻字符串数组中的特定字符串 格式:v=filter(x,s[,include[,compare]]) 实例: Dim x()={"kjwang","wangkj","peter"} Dim v v=filter(x,"kj") '结果v(0)="kjwang",v(1)="wangkj" v=filter(x,&q

  • ES6(ECMAScript 6)新特性之模板字符串用法分析

    本文实例讲述了ES6(ECMAScript 6)新特性之模板字符串用法.分享给大家供大家参考,具体如下: ES6引入了一种新型的字符串字面量语法,我们称之为模板字符串(template strings).除了使用反撇号字符 ` 代替普通字符串的引号 ' 或 " 外,它们看起来与普通字符串并无二致.在最简单的情况下,它们与普通字符串的表现一致: context.fillText(`Ceci n'est pas une cha?ne.`, x, y); 但我们不能说:"原来只是被反撇号括起

  • vbs 获取字符串(截取字串)

    实例代码 x="我们是什么样的网站" y = right(x, len(x)-1) '获取第一字字符之后的所有字符字符 msgbox y 代码中的使用到的函数介绍 left函数可以获取字符串左边的字符 x = left(x, 1) '获取第一个字符 len获取字符串的长度 len(x) split函数分割字符串 x = "1,2,3" split(x, ',') 更多用法可以查看这篇文章:https://www.jb51.net/article/4586.htm

  • JS实现字符串中去除指定子字符串方法分析

    本文实例讲述了JS实现字符串中去除指定子字符串方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script> /*方法一:使用replace函数替换*/ //去除字符串中

  • vbs自动填表单分析附源码

    dim ie  set ie=createobject("internetexplorer.application")  ie.visible=true  ie.navigate "http://www.ln.chinaunicom.com/index.shtml"  While ie.busy or ie.readystate<>4  EndWhile  ie.document.all("userid").value= "

  • 用vbs确定脚本正在哪一个帐户下运行

    问: 您好,脚本专家!如何确定脚本正在哪一个帐户下运行? -- KW 答: 您好,KW.您知道,自从我们以各种托辞而开设这一专栏以来已有一段时间了,对于我们而言,这并非易事:毕竟,寻找托辞是我们这些脚本专家的拿手好戏.明确了这一点,那就让我们以我们最喜欢的一个托辞开始吧:我们将向您介绍的脚本只在 Windows XP 和 Windows Server 2003 上有效.我们将向您介绍使得该脚本在 Windows 2000 上同样有效的方法,但后者绝对不及前者好. 噢,是的:现在感觉该方法不错.

随机推荐