【问题标题】:Loop takes forever with large count循环需要大量时间
【发布时间】:2011-03-24 21:26:41
【问题描述】:

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

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

如何优化???

【问题讨论】:

  • 必须有一种方法可以使用loans.Select() 方法来获得所需的结果。有谁知道该怎么做?我正在调查它,但我现在正在谷歌搜索,哈哈
  • 你是在发布模式还是调试模式下计时?如果您在调试器/vs 托管过程中运行它,测试主机可能会影响您的时间...

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    s = new StringBuilder(loans.Count * averageExpectedStringSize)
    

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

    【讨论】:

    • 似乎并没有提高性能。伙计,这已经杀死了我这么久!
    • 恐怕我没有其他建议了。仅基于您提供的代码 sn-p,它看起来应该在线性时间内运行。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      • 您正在处理的字符串是 huggggge(例如,如果结果字符串是 1 GB)。
      • 您的机器上正在运行另一个进程,占用了您的所有时钟周期。
      • 您的机器内存不足。

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

      【讨论】:

        【解决方案5】:

        您可以考虑另一种方式。

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-03
            • 2021-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多