循环需要大量计数

时间:2010-08-03 18:24:19

标签: vb.net performance optimization for-loop stringbuilder

这个循环需要永远运行,因为循环中的项目数量接近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

是一个StringBuilder。第一行

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

即使有数千条记录,也只需几秒即可运行。这是需要一段时间的实际循环。

如何优化???

6 个答案:

答案 0 :(得分:2)

将StringBuilder的初始容量设置为较大的值。 (理想情况下,足够大以包含整个最终字符串。)像这样:

s = new StringBuilder(loans.Count * averageExpectedStringSize)

如果您没有指定容量,那么构建器可能最终会进行大量的内部重新分配,这会导致性能下降。

答案 1 :(得分:1)

你可以将特殊情况从循环中取出,因此你不需要在循环中检查它。不过,我希望这对性能几乎没有影响。

For i = 0 To last - 1
    s.AppendLine(loans(i))
Next
s.Append(loans(last))

答案 2 :(得分:1)

我无法看到你指出的代码如何缓慢,除非:

  • 您正在处理的字符串是huggggge(例如,如果结果字符串是1千兆字节)。
  • 您的计算机上正在运行另一个进程,耗费所有时钟周期。
  • 您的机器内存不足。

尝试逐行逐步执行代码并检查字符串是否包含您期望的数据,并检查任务管理器以查看应用程序使用的内存量以及可用内存量。

答案 3 :(得分:1)

虽然在内部,代码非常相似,但如果你使用的是.NET 4,我会考虑用String.Join一次调用替换你的方法:

Dim result as String = String.Join(Envionment.NewLine, lar.CreateLoanLines())

答案 4 :(得分:0)

我的猜测是每次你使用追加它都会创建一个新的字符串。你似乎知道你需要多少内存,如果先分配所有内存然后再将其复制到内存中它应该运行得更快。虽然我可能对vb.net的运作方式感到困惑。

答案 5 :(得分:0)

你可以看看另一种方式。

Dim str As String = String.Join(Environment.NewLine, loans.ToArray)