|
■No80396 (さくらとあおい さん) に返信 > これは、お手本の内容をベースにして1行書き込みなので、 > ライトの前に複数行を1つのテキストにして、書き込む様に > 変更します。
随時出力であれば、データ件数が増えてもさほど低速化はしないのですが、 一括出力するのであれば、StringBuilder を使うことをお奨めします。
書き込みに時間がかかるストレージの場合、一括出力は高速化の効果がありますが、 そのための文字列連結に時間がかかってしまうようだと、むしろ逆効果になります。
先に紹介した URL でも触れられていますが、 単純な文字列連結だけで処理してしまうと、 メモリの再確保・転送・解放のための時間が余計にかかり、 行数に対して処理時間が加速度的に増加することになります。
Public Class Form1 '同じデータを10万行出力する Private Const LineCount = 100000
' 文字列連結。当方環境では 21.56秒。 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim st = Stopwatch.StartNew
Dim appendLine As String = "1,2,3" & vbCrLf
Dim csv As String = "" For n = 1 To LineCount csv &= appendLine Next System.IO.File.WriteAllText("C:\TEST\SAMPLE1.CSV", csv)
st.Stop() Button1.Text = st.Elapsed.ToString End Sub
' 随時出力。当方環境では 0.012秒。 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim st = Stopwatch.StartNew
Dim appendLine As String = "1,2,3" Using sw As New System.IO.StreamWriter("C:\TEST\SAMPLE2.CSV") For n = 1 To LineCount sw.WriteLine(appendLine) Next sw.Close() End Using
st.Stop() Button2.Text = st.Elapsed.ToString End Sub
' StringBuilder による連結 & 一括出力。当方環境では 0.008秒。 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click Dim st = Stopwatch.StartNew
Dim appendLine As String = "1,2,3"
Dim csv As New System.Text.StringBuilder() For n = 1 To LineCount csv.AppendLine(appendLine) Next System.IO.File.WriteAllText("C:\TEST\SAMPLE3.CSV", csv.ToString())
st.Stop() Button3.Text = st.Elapsed.ToString End Sub End Class
|