読者です 読者をやめる 読者になる 読者になる

ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

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());
        }
    }
}