(出于好奇纯)在VB.net,我测试串联100K串并独自发现了一个线程在23毫秒做到了。两个线程(每个连接50k)然后在最后加入两个线程需要30毫秒。性能方面,在处理仅100k串联时使用多线程似乎不是有益的。然后我尝试了300万字符串连接,每个处理1.5MM的两个线程总是拆除一个处理全部300万个线程的线程。我想在某些时候使用3个线程变得有益,然后是4,依此类推。有没有更有效的方法来连接.NET中的数百万个字符串?线程值得使用吗?字符串连接和线程在.NET
仅供参考,这是我写的代码:
Imports System.Text
Imports System.Threading
Imports System.IO
Public Class Form1
Dim sbOne As StringBuilder
Dim sbTwo As StringBuilder
Dim roof As Integer
Dim results As DataTable
Sub clicked(s As Object, e As EventArgs) Handles Button1.Click
results = New DataTable
results.Columns.Add("one thread")
results.Columns.Add("two threads")
results.Columns.Add("roof")
For i As Integer = 1 To 3000000 Step 100000
roof = i
Dim test() As Double = runTest()
results.Rows.Add(test(0), test(1), i)
Console.WriteLine(roof)
Next
Dim output As New StringBuilder
For Each C As DataColumn In results.Columns
output.Append(C)
output.Append(Chr(9))
Next
output.Append(vbCrLf)
For Each R As DataRow In results.Rows
For Each C As DataColumn In results.Columns
output.Append(R(C))
output.Append(Chr(9))
Next
output.Append(vbCrLf)
Next
File.WriteAllText("c:\users\username\desktop\sbtest.xls", output.ToString)
Console.WriteLine("done")
End Sub
Function runTest() As Double()
Dim sb As New StringBuilder
Dim started As DateTime = Now
For i As Integer = 1 To roof
sb.Append(i)
Next
Dim result As String = sb.ToString
Dim test1 As Double = Now.Subtract(started).TotalMilliseconds
sbOne = New StringBuilder
sbTwo = New StringBuilder
Dim one As New Thread(AddressOf tOne)
Dim two As New Thread(AddressOf tTwo)
started = Now
one.Start()
two.Start()
Do While one.IsAlive Or two.IsAlive
Loop
result = String.Concat(one.ToString, two.ToString)
Dim test2 As Double = Now.Subtract(started).TotalMilliseconds
Return {test1, test2}
End Function
Sub tOne()
For i As Integer = 1 To roof/2
sbOne.Append(i)
Next
End Sub
Sub tTwo()
For i As Integer = roof/2 To roof
sbTwo.Append(i)
Next
End Sub
End Class
“StringBuffer”可能会更好。 –
尝试从'System.Text'使用'StringBuilder'类 –
这取决于您编写代码的方式以及您拥有的核心数量。出于好奇:这是一个研究还是现实世界的例子?也尝试使用ThreadPool(看看异步委托和QueueUserWOrkItem)。不要忘记,线程初始化需要一些时间 - 当.NET和OS准备新线程时,您的单线程算法已经开始连接。线程不是为了各种目的。 –