VBNET 字串相加效能的比較

最近有個案子效能緩慢,委辦單位要我查一下,其中有一部份針對字串相加來做比較細的測試,在 VB2005 下,測試的項目分成四種:

  1. String : 標準字串相加,用 String &= strAdd
  2. String Builder : 使用 .Net 類別,提高相加效能。
  3. String Array : 使用字串陣列後,再用 Join 函數組合。
  4. Memory String : 在 .Net 1.1 時,因為 String Builder 效能比 String Array 差,但是彈性比 String Array 大,所以我自己用個 MemoryStream 來當成記憶體檔案,供測試使用。

測試時,為避免其他應用程式干擾,所以改採用 CPU Time ,也就是 CPU 實際使用的時間,先做簡單測試,發現標準字串相加倍率差太多了,在高次數測試時,就跳過標準字串相加,僅測 2, 3, 4 三種,另外最後測試換行指令直接放在類別或組合字串內使用。測試結果整理表個如下:

項目

次數

CPU 時間

平均執行時間

換行

String 

      10,000

  14,062,500

0.000140625000

外加

StringBuilder 

      10,000

      156,250

0.000001562500

外加

String Array 

      10,000

      312,500

0.000003125000

外加

Memory String 

      10,000

      312,500

0.000003125000

外加

StringBuilder 

 1,000,000

  22,968,750

0.000002296875

外加

String Array 

 1,000,000

  28,125,000

0.000002812500

外加

Memory String 

 1,000,000

  28,750,000

0.000002875000

外加

StringBuilder 

 1,000,000

  23,750,000

0.000002375000

結合

String Array 

 1,000,000

  28,593,750

0.000002859375

結合

由測試程式碼發現,String Builder 在 .Net 2.0 效能獲得極大改善,比 String Array 還快,換行字串外加比內含快一點,也就是 StringBuilder.Append(strAdd & vbNewLine) 比 StringBuilder.Append(strAdd) ,我自己的 Memory String 類別也可以廢了~

程式碼轉貼如下:


Dim nowDate As Date = DateTime.Now
Dim nCount As Integer = 9999
Dim strAdd As String
Dim ibc As Integer
Dim myProcess As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess()
Dim sCPUTime, dCPUTime As TimeSpan

TextBox1.Text = ""

 

‘ String 

strAdd = ""

sCPUTime = myProcess.UserProcessorTime

For ibc = 0 To nCount

     strAdd &= nowDate & vbNewLine

Next

dCPUTime = New TimeSpan(myProcess.UserProcessorTime.Ticks – sCPUTime.Ticks)

TextBox1.Text &= "String: " & vbTab & strAdd.Length & vbTab & dCPUTime.Ticks & vbNewLine

 

‘ StringBuilder

Dim sb As New System.Text.StringBuilder

strAdd = ""

sCPUTime = myProcess.UserProcessorTime

For ibc = 0 To nCount

     sb.Append(nowDate & vbNewLine)

Next

strAdd = sb.ToString()

dCPUTime = New TimeSpan(myProcess.UserProcessorTime.Ticks – sCPUTime.Ticks)

TextBox1.Text &= "StringBuilder: " & vbTab & strAdd.Length & vbTab & dCPUTime.Ticks & vbNewLine

 

‘ String Array

Dim sa(nCount) As String

strAdd = ""

sCPUTime = myProcess.UserProcessorTime

For ibc = 0 To nCount

     sa(ibc) = nowDate & vbNewLine

Next

strAdd = Join(sa, "")

dCPUTime = New TimeSpan(myProcess.UserProcessorTime.Ticks – sCPUTime.Ticks)

TextBox1.Text &= "String Array: " & vbTab & strAdd.Length & vbTab & dCPUTime.Ticks & vbNewLine

 

‘ Memory String

Dim ms As New MemoryString

strAdd = ""

sCPUTime = myProcess.UserProcessorTime

For ibc = 0 To nCount

     ms.Write(nowDate & vbNewLine)

Next

strAdd = ms.ToString()

dCPUTime = New TimeSpan(myProcess.UserProcessorTime.Ticks – sCPUTime.Ticks)

TextBox1.Text &= "Memory String: " & vbTab & strAdd.Length & vbTab & dCPUTime.Ticks & vbNewLine


換行內含


‘ StringBuilder

Dim sb As New System.Text.StringBuilder

strAdd = ""

sCPUTime = myProcess.UserProcessorTime

For ibc = 0 To nCount

     sb.AppendLine(nowDate)

Next

strAdd = sb.ToString()

dCPUTime = New TimeSpan(myProcess.UserProcessorTime.Ticks – sCPUTime.Ticks)

TextBox1.Text &= "StringBuilder: " & vbTab & strAdd.Length & vbTab & dCPUTime.Ticks & vbNewLine

 

‘ String Array

Dim sa(nCount) As String

strAdd = ""

sCPUTime = myProcess.UserProcessorTime

For ibc = 0 To nCount

     sa(ibc) = nowDate

Next

strAdd = Join(sa, vbNewLine) & vbNewLine

dCPUTime = New TimeSpan(myProcess.UserProcessorTime.Ticks – sCPUTime.Ticks)

TextBox1.Text &= "String Array: " & vbTab & strAdd.Length & vbTab & dCPUTime.Ticks & vbNewLine

廣告
Categories: 技術分享 | 發表留言

文章分頁導航

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在WordPress.com寫網誌.

%d 位部落客按了讚: