DOBON.NET DOBON.NETプログラミング掲示板過去ログ

.net独特のパフォーマンスが悪い処理について

環境/言語:[C#]
分類:[.NET]

2012/02/03(Fri) 15:49:40 編集(投稿者)

C#でCSVファイルを読み込んでパースして画面表示に反映させたりする処理を書いています。

入門書にも出てきそうな以下のような普通の書き方で実行したのですが
1行あたり3列(各10バイト程度)で1000行程度の読み込みに10秒以上かかります。

StreamReader sr = new StreamReader("test.txt");
while ((String line = sr.ReadLine()) != null) {
//具体的な処理
}

ググってみるとC#はreadlineが遅いとのことで一度すべて読み込んでからの方が処理が速いとのことで↓みたいに書いてみたところほぼ待ち時間なしで(1秒以内ぐらいで)処理が終わりました

StreamReader sr = new StreamReader("test.txt");
String[] lines = sr.ReadToEnd().Split('\n');
for(int i=0;i<lines.Length;i++){
//具体的な処理
}


最終的にはCSVのパースクラスのTextFieldParserを使いましたがこちらも処理は一瞬でした。

自分の専門はWEBシステムなので サーバーのメモリを無駄遣いしないようにファイル読み込み時はreadlineで1行ずつ必要な分だけ読み込んで書くのが当たり前だと思っていたのですが .netの場合は違うみたいですね。

他にもCSVのデータをDataGridViewに表示するのも1件ずつ登録だと激遅なのに
一度中間のDataTableに変換してからDataSourceで指定すると一瞬だったり
.net特有の癖みたいなの結構ある気がしています。

問題発覚したときにググると 単発のブログ記事とかはひっかかるのですが まとめてるサイトとかあれば先に一通り目を通しておきたいな、と思いまして
この手の.net特有の癖みたいなのをまとめているサイトがありましたら教えてください。


何かご存じの物があればよろしくお願いいたします。
直感的には列の分割が必要ない分TextFieldParserよりStreamReaderの方が
速そうに思えますが、そうはならないのですね。うーむ、どういう理屈で
そうなるのか知りたいです。誰かご存じの方はおられないでしょうか?(チラ

DOBON.NET | プログラミング道 | プログラミング掲示板