(из чистого любопытства) На VB.net я протестировал конкатенацию 100-килограммовых строк и обнаружил, что один поток сделал это за 23 миллисекунды.Два потока (каждый из которых объединяет 50 тыс.), А затем их объединение в конце заняли 30 миллисекунд.С точки зрения производительности, казалось бы, не выгодно использовать несколько потоков при работе только с конкатенациями по 100 тыс.Затем я попробовал 3 миллиона конкатенаций строк и два потока, каждый из которых обрабатывал 1,5 мм, всегда сносил один поток, обрабатывая все 3 миллиона.Я предполагаю, что в какой-то момент использование 3 потоков становится выгодным, затем 4 и так далее.Есть ли более эффективный способ объединения миллионов строк в .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