字符串连接是开发中频繁使用的一种操作
本次进行比较的目的在于 看看 .Net 在字符串连接中的改进以及完全编译带来的效率?
测试使用3种开发工具: VB6,VB.Net2003(由于C#和VB.Net 一样所以没有测试),Delphi7
测试字符串 Hello World!You are Welcome! 连接 50000 次的消耗的时间
使用 API _GetTickCount 来计算消耗,测试用机: 赛扬1G,内存:390,Win2000
测试1: VB(开取全部优化编译的选项)
由于VB使用普通的字符串连接效率及其低下,所以本测试以 使用 CStringBuilder 来连接所耗费的时间为准
普通连接代码
Dim II As Long
Dim Str As String
Dim T As Long
T = GetTickCount
For II = 1 To 50000
Str = Str & "Hello World!You are Welcome!"
NextMsgBox CStr(GetTickCount - T)
测试结果: 2分钟无响应.....失败
使用 CStringBuilder 连接代码
Dim II As Long
Dim Str As New cStringBuilder
Dim T As Long
Dim ss As String
T = GetTickCount
For II = 1 To 50000
Str.Append "Hello World!You are Welcome!"
Next
ss = Str.toString
MsgBox CStr(GetTickCount - T)测试结果: Test1: 521,Test2:511,Test3:531
取中间值:521
2.VB.Net 的测试
在VB.Net 中,虽然仍然可以使用 & 来连接字符串,但是该中方法效率没有任何提高,所以以使用
System.Text.StringBuilder 的类来连接为准
普通连接代码:
Dim II As Int32
Dim Str As String
Dim ss As String
Dim t As Int32t = GetTickCount()
For II = 1 To 50000Str = Str & "Hello World!You are Welcome!"
Next
MessageBox.Show(CStr(GetTickCount - t))
测试结果: 2分钟无响应,失败
使用 System.Text.StringBuilder 连接测试
Dim II As Int32
Dim Str As New System.Text.StringBuilder
Dim ss As String
Dim t As Int32t = GetTickCount()
For II = 1 To 50000Str.Append("Hello World!You are Welcome!")
Next
ss = Str.ToString
MessageBox.Show(CStr(GetTickCount - t))测试结果: Test1: 60,Test2:60,Test3:60
取中间值: 60
3.Delphi
在Delphi 中,使用 + 来连接字符串,不同的是 Borland 已经为该连接方式作了充分优化
var T,II : integer;
var str : string;
var strTime:string;
var ss: string;
begin
T:=Gettickcount; //使用API_GetTickCount 兼容于所有开发程序
for II := 1 to 50000 do
begin
str := str+'Hello World!You are Welcome!'; //进行字符串连接
end;
ss:=Str;//将字符串传送
strtime:=IntToStr(Gettickcount-T);//获得使用时间
MessageBox(0,Pchar(strtime), '',MB_ICONINFORMATION);end;
测试结果: Test1:20,Test2:30,Test3:20
中间值:20
3种工具的综合结论:
其实字符串优化原理就是: 字符串连接 总是销毁原有对象还是在原有对象上连接
毫无疑问,Delphi 的字符串连接速度是最快的,看来Borland 在编译器上还是下了一定功夫的
而 .net 使用普通连接的方式没有丝毫的优化,而使用 Stringbuilder 的Vb 和VB.net 在速度上
都有很大的提升,可以以百倍来形容,由于 VB.net 本身是完全编译的,所以 和VB 的速度差异就
出来了 60:521 ....虽然 .net 的速度不及Delphi ,但结果已经很接近,相差几十毫秒而已,基本可以忽略不计
事实上,在微软大部分开发工具, 使用简单 字符串连接的 效率都是很低的,因为微软并没有针对他进行优化
当然 Vc++ 除外,因为 他是使用字符串数组和并的方式进行连接的,当然在MFC框架下提供了类似
Stringbulider 的CString 的对象,估计操作方式和 StringBuilder 差不多,由于本人C功很差,所以就没有进行测试
有兴趣的朋友可以自己进行以上测试,包括VC并把结果回复到本贴上,供大家参考
//////////////////////////////
附:VB6中使用的 CStringBuilder 类的代码 使用方法参考上面
Option Explicit
' The secret to this class is that it uses the join
'function which is part of the VBA.Strings Class
Private mvarStringArray() As String
Private mvarArrayItems As Long
Public Sub Append(ByVal newStr As String)
ReDim Preserve mvarStringArray(mvarArrayItems) As String
mvarStringArray(mvarArrayItems) = newStr
mvarArrayItems = mvarArrayItems + 1
End Sub
Public Property Get toString() As String
If mvarArrayItems > 0 Then toString = Join(mvarStringArray, "")
End Property
Public Sub Reset()
mvarArrayItems = 0
Erase mvarStringArray
End Sub
Private Sub Class_Initialize()
If mvarArrayItems > 0 Then Reset
End Sub
Private Sub Class_Terminate()
Reset
End Sub