【发布时间】: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