Цикл длится вечно с большим количеством - PullRequest
0 голосов
/ 03 августа 2010

Этот цикл выполняется вечно, так как количество элементов в цикле приближается к чему-то близкому к 1000 и более, примерно к 10 минутам.Это должно быть быстрым для сумм до 30-40 тысяч.

'Add all Loan Record Lines
Dim loans As List(Of String) = lar.CreateLoanLines()
Dim last As Integer = loans.Count - 1
For i = 0 To last
    If i = last Then
        s.Append(loans(i))
    Else
        s.AppendLine(loans(i))
    End If
Next

s - это StringBuilder.Первая строка там

Dim loans As List(Of String) = lar.CreateLoanLines()

Запускается всего за несколько секунд, даже с тысячами записей.Это фактический цикл, который занимает некоторое время.

Как это можно оптимизировать ???

Ответы [ 6 ]

2 голосов
/ 03 августа 2010

Установите начальную емкость вашего StringBuilder на большое значение.(В идеале, достаточно большой, чтобы вместить всю конечную строку.) Примерно так:

s = new StringBuilder(loans.Count * averageExpectedStringSize)

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

1 голос
/ 03 августа 2010

Хотя внутренне код очень похож, если вы используете .NET 4, я бы подумал о замене вашего метода одним вызовом String.Join :

Dim result as String = String.Join(Envionment.NewLine, lar.CreateLoanLines())
1 голос
/ 03 августа 2010

Я не вижу, как код, который вы указали, может быть медленным, если:

  • Строки, с которыми вы имеете дело, являются huggggge (например, если результирующая строка равна 1 гигабайту).
  • На вашем компьютере запущен еще один процесс, который использует все ваши тактовые циклы.
  • В вашей машине недостаточно памяти.

Попробуйте построчно пройти по коду и убедитесь, что строки содержат ожидаемые вами данные, и проверьте диспетчер задач, чтобы узнать, сколько памяти использует ваше приложение и сколько свободной памяти у вас есть.

1 голос
/ 03 августа 2010

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

For i = 0 To last - 1
    s.AppendLine(loans(i))
Next
s.Append(loans(last))
0 голосов
/ 03 августа 2010

Вы можете посмотреть на это по-другому.

Dim str As String = String.Join(Environment.NewLine, loans.ToArray)
0 голосов
/ 03 августа 2010

Я думаю, что каждый раз, когда вы используете append, создается новая строка.Кажется, вы знаете, сколько памяти вам понадобится, если вы сначала выделите всю память, а затем просто скопируете ее в память, она должна работать намного быстрее.Хотя я могу быть смущен тем, как работает vb.net.

...