DataTable.Select vs LINQ
LINQによってデータ取得をSQLっぽく出来るようになったので、DataTable.Selectのようなメソッドは必要なのか?と、ふと思いパフォーマンス比較をしてみることに。
using System; using System.Data; using System.Diagnostics; using System.Linq; class Program { static void Main (string args) { DataTable t = new DataTable (); t.Columns.Add ("KEY1",typeof (int)); t.Columns.Add ("KEY2",typeof (string)); t.Columns.Add ("KEY3",typeof (string)); for (int i = 0; i < 1000; ++i) { DataRow r = t.NewRow (); r["KEY1"] = i; r["KEY2"] = i.ToString (); r["KEY3"] = i.ToString (); t.Rows.Add (r); } // DataTable.Select Stopwatch sw = new Stopwatch (); sw.Start (); for (int i = 0; i < 10000; ++i) { DataRow rows = t.Select ("KEY1=500 AND KEY2='500' AND KEY3='500'"); } sw.Stop (); Console.WriteLine (sw.ElapsedMilliseconds); // LINQ sw.Reset (); sw.Start (); for (int i = 0; i < 10000; ++i) { var q = from row in t.Rows.OfType<DataRow> () where row.Field<int> ("KEY1") == 500 && row.Field<string> ("KEY2") == "500" && row.Field<string> ("KEY3") == "500" select row; DataRow[] rows = q.ToArray (); } sw.Stop (); Console.WriteLine (sw.ElapsedMilliseconds); } } /* 結果 193 2682 */
Selectは条件を文字列で指定するので文字列解析の分だけ遅くなると予想していましたが大外れ。(^^;
プロファイラで調べてみないと分かりませんが、LINQはデータアクセスをプロパティ経由で行っているけど、Selectは内部データに直接アクセス出来るのでその分で差が出たんでしょうね。しかし、10倍以上違いますか・・・調子に乗ってLINQばっかり使うのも問題がありそ。