【问题标题】:Loop optimization in VB.NETVB.NET 中的循环优化
【发布时间】:2019-02-10 23:20:29
【问题描述】:

我正在处理存储在名为 FRAME 的字符串中的图像的像素值(不是数字,而是 ASCII)。每个像素值由两个字符组成。我使用一个 3 维字符串数组和两个循环来读取每个值并将它们按顺序排列。

这是我的代码:

    Dim A(3000 - 1, 2000 - 1, 1) As String

    Row = 0
    Column = 0

    S_Len = 12000000

    For i = 0 To S_Len - 1 Step 4
        A(Column, Row, 0) = Mid$(FRAME, i + 1, 1)
        A(Column, Row, 1) = Mid$(FRAME, i + 2, 1)
        Column = Column + 1
        If Column = 3000 Then
            Column = 0
            Row = Row + 2
        End If
    Next i

    Row = 1
    Column = 0

    For i = 2 To S_Len - 1 Step 4
        A(Column, Row, 0) = Mid$(FRAME, i + 1, 1)
        A(Column, Row, 1) = Mid$(FRAME, i + 2, 1)
        Column = Column + 1
        If Column = 3000 Then
            Column = 0
            Row = Row + 2
        End If
    Next i

我在 FRAME 字符串上有一个 6mp 的图像像素值,这是否意味着我有 12000000 个 ASCII 字符。行和列对应于图像的分辨率(3000x2000)。

现在,如果我需要知道位于数组中 X、Y 的特定像素值(由两个 ASCII 字符组成),我在...处找到它。

A(X, Y, 0)

A(X, Y, 1)

这没问题,但它真的很慢,需要几秒钟才能完成循环。如何优化代码以使其更快?我可以在这里使用Parallel.For吗?如果可以,如何使用?

【问题讨论】:

  • 无论你做什么,字符串都会很糟糕,因为对字符串的任何更改都会从头开始重新创建整个字符串。此外,.Net 字符串是完整的 Unicode,而不是 ASCII,因此这 1200000 个 ASCII 字符占用了 48000000 字节的内存:一个字符串就将近 50MB。
  • 另外:你真的想单独查找 (X,Y,0) 和 (X,Y,1) 的那些字符,还是从 2D 中获取两个字符的字符串会更好数组:两个字符都只有 (X,Y)。

标签: arrays vb.net performance loops optimization


【解决方案1】:

你对字符串所做的事情是令人难以置信的内存效率低下。这可能会导致车库收集器和大型对象堆出现BIG 问题。我真的建议 NOT 将这些值加载到一个不可变的字符串中。即使您真的希望将其作为字符,您最好首先将 FRAME 创建为 Char 值数组。


但是对于有问题的代码。 Parallel 可能会做得更好,但我们可以通过组合循环并使用字符串索引器而不是 Mid() 来改进一些东西(Mid() 已过时,仅用于向后兼容旧代码,应该>从不用于新工作)。

Dim A(3000 - 1, 2000 - 1, 1) As Char
Dim Row As Integer = 0, Column As Integer = 0, i As Integer = 0
Dim S_Len As Integer = 12000000

While i < S_Len
    A(Column, Row, 0) = FRAME(i)
    A(Column, Row, 1) = FRAME(i+1)
    A(Column, Row+1, 0) = FRAME(i+2)
    A(Column, Row+1, 1) = FRAME(i+3)

    Column += 1
    If Column = 3000 Then
        Column = 0
        Row += 2
    End IF                

    i+= 4
End While

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 2014-07-30
    • 2017-02-28
    相关资源
    最近更新 更多