|
■No6006 (もっこく さん) に返信
> こちらを解決し「FileStream」と「StreamReader」で再度計測してみましたので、
> ご参考になるかわかりませんが、ご報告いたします。
>
> * 処理件数が少なかったのか大きな差が見えませんでした。
こんにちは。
既に解決済みになっているようですが、そんなに差がでないもんかなぁと思い、
こっちでも一応試してみたので結果だけ載せときます。
試したソース
Private Function CreateEmptyTable() As System.Data.DataTable
Dim tbl As New System.Data.DataTable()
For i As Integer = 1 To 10
tbl.Columns.Add(String.Format("列{0:00}", i), GetType(String))
Next
Return tbl
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim tbl As System.Data.DataTable = Me.CreateEmptyTable()
Dim sw As New System.Diagnostics.Stopwatch()
sw.Start()
Using reader As New System.IO.StreamReader("C:\temp\test.txt", System.Text.Encoding.GetEncoding("Shift_JIS"))
While Not reader.EndOfStream
Dim s As String = reader.ReadLine()
Dim row As System.Data.DataRow = tbl.NewRow()
For i As Integer = 0 To 9
row(i) = VBStrings.MidB(s, i * 100 + 1, 100)
Next
tbl.Rows.Add(row)
End While
End Using
sw.Stop()
MsgBox(String.Format("{0}秒", sw.ElapsedMilliseconds / 1000))
Me.DataGridView1.DataSource = tbl
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim tbl As System.Data.DataTable = Me.CreateEmptyTable()
Dim sw As New System.Diagnostics.Stopwatch()
sw.Start()
Using strm As New System.IO.FileStream("C:\temp\test.txt", IO.FileMode.Open, IO.FileAccess.Read)
Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
While strm.Position < strm.Length
Dim b(1000) As Byte
strm.Read(b, 0, 1000)
Dim row As System.Data.DataRow = tbl.NewRow()
For i As Integer = 0 To 9
row(i) = enc.GetString(b, i * 100, 100)
Next
tbl.Rows.Add(row)
strm.Read(b, 0, 2) '改行コード分
End While
End Using
sw.Stop()
MsgBox(String.Format("{0}秒", sw.ElapsedMilliseconds / 1000))
Me.DataGridView1.DataSource = tbl
End Sub
test.txtは、1行1000バイトの500行です。
Button1_ClickでMsgBoxに表示された秒数は3回試してそれぞれ0.147, 0.138, 0.145
Button2_ClickでMsgBoxに表示された秒数は3回試してそれぞれ0.049, 0.052, 0.052
はっきりした差はでましたが体感ではStreamReaderでもぜんぜん重さは感じないですね。
ボトルネックは違うところにあったのかなぁ…
|