Конкатенация строк и потоков в .NET - PullRequest
1 голос
/ 19 октября 2011

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

At around 1MM string concatenations, it appears multiple threads can improve performance

Кстати, вот код, который я написал:

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

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Потоки предназначены для задач, которые стоят дороже, чем конкатенация строк.

Конкатенация строк включает в себя выделение и копирование памяти;это не очень трудоемкая задача.
Многопоточность следует использовать при работе с ресурсоемкими задачами, чтобы избежать блокирования потока пользовательского интерфейса.

Потоки также могут быть полезны для парализующих задач, ожидающихразные вещи (например, сетевой IO для нескольких медленных серверов или сетевой или дисковый IO)

2 голосов
/ 19 октября 2011

Проверьте подпрограмму .EnsureCapacity в StringBuilder.Если вы делаете много конкатенации и знаете примерно количество символов, вы можете инициализировать буфер строителя строк сразу, вместо того, чтобы позволить этому происходить динамически.Вы должны увидеть еще несколько улучшений.

http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.ensurecapacity.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...