这个循环需要永远运行,因为循环中的项目数量接近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()
即使有数千条记录,也只需几秒即可运行。这是需要一段时间的实际循环。
如何优化???
答案 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)
我无法看到你指出的代码如何缓慢,除非:
尝试逐行逐步执行代码并检查字符串是否包含您期望的数据,并检查任务管理器以查看应用程序使用的内存量以及可用内存量。
答案 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)