Vb.net 循环时间长,计数大

Vb.net 循环时间长,计数大,vb.net,performance,optimization,for-loop,stringbuilder,Vb.net,Performance,Optimization,For Loop,Stringbuilder,当循环中的项目数量接近或超过1000,接近10分钟时,此循环将永远运行。这需要快速运行,直到3-4万美元 '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

当循环中的项目数量接近或超过1000,接近10分钟时,此循环将永远运行。这需要快速运行,直到3-4万美元

'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()
即使有数千条记录,也只需几秒钟即可运行。实际的循环需要一段时间


如何对其进行优化?

您可以将特殊情况从循环中去掉,这样就不需要在循环中检查它。然而,我希望这对性能几乎没有影响

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

您可以将特殊情况从循环中取出,这样就不需要在循环中检查它。然而,我希望这对性能几乎没有影响

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

将StringBuilder的初始容量设置为较大的值。(理想情况下,大到足以容纳整个最终字符串。)如是:

s = new StringBuilder(loans.Count * averageExpectedStringSize)

如果不指定容量,构建器可能会执行大量的内部重新分配,这将降低性能。

将StringBuilder的初始容量设置为较大的值。(理想情况下,大到足以容纳整个最终字符串。)如是:

s = new StringBuilder(loans.Count * averageExpectedStringSize)

如果不指定容量,构建器很可能会进行大量的内部重新分配,这会降低性能。

我猜每次使用append时,都会创建一个新字符串。您似乎知道需要多少内存,如果您先分配所有内存,然后将其复制到内存中,那么它应该运行得更快。尽管我可能会对vb.net的工作原理感到困惑。

我的猜测是,每次使用append时,它都会创建一个新字符串。您似乎知道需要多少内存,如果您先分配所有内存,然后将其复制到内存中,那么它应该运行得更快。尽管我可能对vb.net的工作原理感到困惑。

我看不出您指出的代码有多慢,除非:

  • 您正在处理的字符串是hugggge(例如,如果生成的字符串为1G字节)
  • 您的计算机上正在运行另一个进程,该进程占用您的所有时钟周期
  • 你的机器内存不足

请尝试逐行检查代码,并检查字符串是否包含所需的数据,然后检查任务管理器以查看应用程序正在使用的内存量和可用内存量。

我看不出您指出的代码有多慢,除非:

  • 您正在处理的字符串是hugggge(例如,如果生成的字符串为1G字节)
  • 您的计算机上正在运行另一个进程,该进程占用您的所有时钟周期
  • 你的机器内存不足

请尝试逐行遍历代码,检查字符串是否包含所需的数据,并检查任务管理器以查看应用程序正在使用的内存量和可用内存量。

您可以用另一种方法来执行此操作

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

你可以换一种方式来做

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

但是,内部代码非常相似,如果你使用.NET 4,我会考虑用一个单一的调用替换你的方法:


但是,内部代码非常相似,如果你使用.NET 4,我会考虑用一个单一的调用替换你的方法:


必须有一种方法可以使用loans.Select()方法来获得所需的结果。有人知道怎么做吗?我正在研究它,但我现在正在谷歌上搜索,你是在发布模式下计时,还是在调试模式下计时?如果在调试器/vs宿主进程中运行此测试,测试主机可能会影响您的计时…必须有一种方法可以使用loans.Select()方法来获得所需的结果。有人知道怎么做吗?我正在研究它,但我现在正在谷歌上搜索,你是在发布模式下计时,还是在调试模式下计时?如果在调试器/vs宿主进程中运行此测试,则测试主机可能会影响您的计时…似乎不会提高任何性能。老兄,这么长时间来我都快死了!恐怕我没有别的建议了。仅根据您提供的代码片段,它看起来应该以线性时间运行。似乎不会提高性能。老兄,这么长时间来我都快死了!恐怕我没有别的建议了。仅根据您提供的代码片段,它看起来应该以线性时间运行。