|
■No79955 (つまようじ さん) に返信
> 現在、VB2010 .net framework 3.0 C#にてCSV出力プログラムを作成しています。 > StringBuilderで文字連結を行っていると定期的に時間がかかってしまう行があります。 > > > 以下ソース > > StringBuilder sb = new StringBuilder(1024 * 10000); > int[] t1 = new int[3000]; > > for (int count = 0; count < 3000; count++) > { > //開始時間測定 > t1[count] = System.Environment.TickCount; > > for(int count2 = 0; count2 < 3000; count2++) > { > //文字連結 > sb.Append("1.0000000000E+60").Append(","); > } > //改行 > sb.Append("\n"); > > //終了時間測定 > t1[count] = System.Environment.TickCount - t1[count]; > } > > だいたい100行に一回程度10ms程度かかる行があり、 > 原因がわからず、困っております。 > > 皆さま、ご教授よろしくお願いいたします。
1行あたりの文字数が
"1.0000000000E+60"+","の1文字で18文字あります。これを3000回つなげるので 18x3000 で 54,000文字。 これが1行あたりの文字数になります(正確には、これに改行が入るのですがそこは省略)。 一方、StringBuilder に渡した初期のキャパシティは、1024x10,000 なので、10,240,000 文字分。 ざっくりですが200行には足らない程度の量となります。
時間のかかるタイミングですが、最初の200行くらいは問題がなく そのあと100行いかないくらいの間隔で時間がかかっていませんか?
自分では計測していないのでわかりませんが。 もしそうなら、想定される動作の範疇にあると言えます。
このデータの場合、必要となるメモリサイズは、 (18x3000+1)*3000 文字分なので、162,003,000 文字分になります。 少し余裕を持たせるなら、60000*3000あればよいと思います。
もし、これでも途中で時間がかかるタイミングがある場合は、文字数と言いながらバイト数を確保していると思うので さらにx2すれば、時間がかかることはないと思います。
ただ、そこまでするくらいなら、直接ストリームに書き込むほうが良いと思いますけどね。
|