LambdicSql - 速度はまだまだでした・・・ -
※この書き方は最新のLambdicSqlとは異なります。速度計測の記録なので以前のままにしております。
※@yone64さんと@neueccさんにご指摘いただき、タイトルを含め修正しました。
結果から書くと、負け負けのようですね。
これはパフォーマンス改善を先にやるかなー。
テーブル
対象はこんなテーブルで1万件データが入っています。
IntVal | FloatVal | DoubleVal | DecimalVal | StringVal |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 | 3 |
4 | 4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 | 5 |
… | … | … | … | … |
スコア
スコアです。単位はミリ秒です。
(msec) | LambdicSql | Dapper |
---|---|---|
1 | 359 | 335 |
2 | 29 | 27 |
3 | 26 | 22 |
4 | 31 | 30 |
5 | 25 | 26 |
6 | 26 | 25 |
7 | 33 | 29 |
8 | 29 | 29 |
9 | 24 | 25 |
10 | 32 | 29 |
平均 | 61.4 | 57.7 |
まあ、でも一万件でこれなら誤差なんじゃないかなー。
と思っておりましたが、
@neueccさんから
「いや、全然誤差じゃないですよ」
ってご指摘いただきました。
で、測り方も、適当すぎると。
「DBって割合としてはwhereで絞って1件とか数件とかってのを対象にするのがほとんどで、良質なネットワーク・良質なデータベースを相手にしていると1ms以下で結果取れたりします。そこで一回のクエリに2msプラスで乗っかると、なんともいえない気持ちにはなります:)」
で、再計測。下のコードでデータをWhereで1件に絞っている方ですね。本来はマッピングの処理だけを測るべきなのですが、一旦。
(msec) | LambdicSql | Dapper |
---|---|---|
1 | 3.355 | 2.1567 |
2 | 2.3942 | 0.7323 |
3 | 5.136 | 0.7556 |
4 | 1.8724 | 0.7031 |
5 | 2.1095 | 0.585 |
6 | 1.8391 | 0.72 |
7 | 1.8736 | 0.7003 |
8 | 1.8342 | 0.7007 |
9 | 3.1561 | 0.7081 |
平均 | 2.6189 | 0.862422222 |
コード
こんなコードで計測しました。念のためリリースビルドでやってます。
using Dapper; using LambdicSql; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Diagnostics; using System.Linq; using System.Windows.Forms; namespace Performance { class TableValues { public int IntVal { get; set; } public float FloatVal { get; set; } public double DoubleVal { get; set; } public decimal DecimalVal { get; set; } public string StringVal { get; set; } } class DB { public TableValues TableValues { get; set; } } [TestClass] public class SelectTime { //1万件取得 [TestMethod] public void CheckLambdicSql() { var times = new List<double>(); using (var connection = new SqlConnection(TestEnvironment.ConnectionString)) { connection.Open(); for (int i = 0; i < 10; i++) { var watch = new Stopwatch(); watch.Start(); var datas = Sql.Query<DB>().SelectFrom(db => db.TableValues).ToExecutor(connection).Read().ToList(); watch.Stop(); times.Add(watch.Elapsed.TotalMilliseconds); } } ShowTime(times); } [TestMethod] public void CheckDapper() { var times = new List<double>(); using (var connection = new SqlConnection(TestEnvironment.ConnectionString)) { connection.Open(); for (int i = 0; i < 10; i++) { var watch = new Stopwatch(); watch.Start(); var datas = connection.Query<TableValues>("select IntVal, FloatVal, DoubleVal, DecimalVal, StringVal from TableValues;").ToList(); watch.Stop(); times.Add(watch.Elapsed.TotalMilliseconds); } } ShowTime(times); } //以下はwhereで1件に絞ったもの [TestMethod] public void CheckLambdicSqlCondition() { var times = new List<double>(); using (var connection = new SqlConnection(TestEnvironment.ConnectionString)) { connection.Open(); for (int i = 0; i < 10; i++) { var watch = new Stopwatch(); watch.Start(); var datas = Sql.Query<DB>().SelectFrom(db => db.TableValues).Where(db => db.TableValues.IntVal == 1).ToExecutor(connection).Read().ToList(); watch.Stop(); times.Add(watch.Elapsed.TotalMilliseconds); } } ShowTime(times); } [TestMethod] public void CheckDapperCondition() { var times = new List<double>(); using (var connection = new SqlConnection(TestEnvironment.ConnectionString)) { connection.Open(); for (int i = 0; i < 10; i++) { var watch = new Stopwatch(); watch.Start(); var datas = connection.Query<TableValues>("select IntVal, FloatVal, DoubleVal, DecimalVal, StringVal from TableValues where IntVal = 1;").ToList(); watch.Stop(); times.Add(watch.Elapsed.TotalMilliseconds); } } ShowTime(times); } static void ShowTime(List<double> times) { MessageBox.Show(string.Join(Environment.NewLine, times.Select(e => e.ToString())) + Environment.NewLine + times.Average().ToString()); } } }