我有一个超级简单的脚本,用于将我们多年来从捐赠者收集的一长串电话号码分成单独的区号文件。
显然,当你有将近一百万行时,它需要一段时间 - 但是 - 如果我输入1,000,则需要不到一秒钟。一旦我投入100万,只需5秒即可完成5行。怎么会这样?
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
Dim lines As String
lines = RichTextBox1.Lines.Count
Dim looper As String = 0
Dim path As String = "c:\acs\"
MsgBox("I have " + lines + " lines to do.")
If (Not System.IO.Directory.Exists(path)) Then
System.IO.Directory.CreateDirectory(path)
End If
Dim i As String = 0
For loops As Integer = 0 To RichTextBox1.Lines.Count - 1
Dim ac As String = RichTextBox1.Lines(looper).ToString
ac = ac.Substring(0, 3)
Dim strFile As String = path + ac + ".txt"
Dim sw As StreamWriter
sw = File.AppendText(strFile)
sw.WriteLine(RichTextBox1.Lines(looper))
sw.Close()
Label1.Text = String.Format("Processing item {0} of {1}", looper, lines)
looper = looper + 1
Next
MsgBox("done now")
End Sub
结束班
答案 0 :(得分:0)
每次使用RichTextBox.Lines属性时,VB.Net都需要通过CR + LF对分割内容。因此,您的For loops As Integer = - To RichTextBox1.Lines.Count-1
确实会受到性能影响。
尝试使用:
For Each vsLine As String in RichTextBox1.Lines
代替。它会快得多。或者,如果你必须使用For循环,那么得到它一次:
Dim vasLines() As String = RichTextBox1.Lines
For viLines As Integer = 0 to UBound(vasLines.Count)
'....
Next
代替。
答案 1 :(得分:0)
首先,您在For循环中执行UI更新。这需要时间。
您正在更新可能影响性能的主线程的线程中的UI。您不应该使用CheckForIllegalCrossThreadCalls方法。您应该使用BackgroundWorker的ReportProgress方法正确更新UI。
您正在为循环的每次迭代打开和关闭文件。这也需要时间。
我认为更好的方法是将数据添加到Dictionary(Of String,List(Of String)),区域代码作为键,列表将保存该区号的所有数字。字典填满后,循环键并写出数字。