うちのサイトでは地味にアクセス数が多いページで、
意外と遅い DataTable 、なので List を使うと 5 倍早くなる | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/2228/comment-page-1#comment-24840175301577487
というのがあります。もう4年程前の記事で、業務で VB.NET 2.0 を使わないといけなくて、LINQ が使えなかったので、DataTable にしようか、List にしようかという調査の記録です。今だと、もうちょっと色々なやり方があるのですが、ちょっとコメントとが付いたので、計測しなおしてみました。
■list を使う
■list に構造体を使う
上記2つのケースについて、他の3つのケースにて行っている
「あえて最初に行を追加しておく」処理の記述がないように
お見受けしますが、これは単なる誤記であり実際は記述の上
実行された計測結果ということでしょうか。
随分前だったので覚えていないのですが、おそらく比較コードのミスです。あらかじめ1万行いれておいたのは「更新系」をチェックする必要があったので、このままだと list のほうが有利に働きますよね。
気になったので Go4 と Go5 だけ抜き出して書き直しました。
実験コード
public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataTable MakeDataTable() { var dt = new DataTable(); for (int i = 0; i < 100; i++) { dt.Columns.Add(new DataColumn("x" + i.ToString(), typeof(string))); } return dt; } double Go4() { var dt = MakeDataTable();// new DataTable(); // データ更新チェックのため、あらかじめ1万行を作る for (int i = 0; i < 10000; i++) { var row = dt.NewRow(); dt.Rows.Add(row); } // 計測開始 var start = DateTime.Now; var tm = DateTime.Now; for (int i = 0; i < dt.Rows.Count; i++) { var row = dt.Rows[i]; for (int j = 0; j < 100; j++) { row[j] = tm.ToShortDateString(); tm.AddSeconds(1); } } var tend = DateTime.Now; var span = (tend - start).TotalSeconds; return span; } double Go5() { var dt = new List<object>(); // データ更新チェックのため、あらかじめ1万行を作る for (int i = 0; i < 10000; i++) { var row = new object[100]; dt.Add(row); } // 計測開始 var start = DateTime.Now; var tm = DateTime.Now; for (int i = 0; i < dt.Count; i++) { var row = dt[i] as object[]; for (int j = 0; j < 100; j++) { row[j] = tm.ToShortDateString(); tm.AddSeconds(1); } } var tend = DateTime.Now; var span = (tend - start).TotalSeconds; return span; } /// <summary> /// DataTable を利用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { var t = this.Go4(); label1.Text = t.ToString(); } /// <summary> /// list を利用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { var t = this.Go5(); label1.Text = t.ToString(); } }
どちらも、1万行いれておいて、その行に対して逐一データを修正するというスタイルになっています。
コードは Visual Studio 2013 を使っています。
実験結果
DataTable 8.32, 8.12, 8.12 sec
list 0.88, 0.83, 0.83 sec
とう具合に、DataTable よりも list のほうが 10 倍早くなっています。
すべてオンメモリで動くために、後は CPU 速度の違いになるとは思うのですが、PC が異なるし(こっちの PC のほうが断然早いので)相対的な結果になります。以前の 4,5倍よりも開きが大きくなっています。絶対値の違いは、VB が C# よりも遅いのではなくて、計測する CPU の差です。