Quantcast
Channel: ささいなことですが。
Viewing all articles
Browse latest Browse all 104

lambdicSql - パフォーマンス改善せねば -

$
0
0

※この書き方は最新のLambdicSqlとは異なります。速度計測の記録なので以前のままにしております。

前回ので、Dapperに完敗を喫したわけですが、ここで勝負を投げるわけにはいかないですね。改善策を考えてみました。

遅いのは、コンパイル

他にも要因はあるかもしれませんが、まずは分かりやすいところからつぶしていきましょう。

マッピングする型の生成

これは素直にキャッシュすることにしました。一回はコンパイルしますけどね。

パラメータ

※2016/07/12 この仕様やっぱりやめました。
次回へ続く。


今までの仕様だと、どうやってもコンパイルなしには取れないんじゃないかなー。(←いや取れるかも)なので少し面倒になりますが、パラメータを別途渡せるようにしました。pの型を第二引数で決定するというところが微妙。あまり速度が気にならない人は、今まで通り書けます。ミリ秒を争う場合はこれを使うってことでどうでしょう?
α0.0.20
で一旦Whereだけに実験的に実装してみました。

[TestMethod]
publicvoid 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).
            //★Dapperと同じようにパラメータを渡す
            Where((db, p) => db.TableValues.IntVal == p.val, new { val = 1 }).
            ToExecutor(connection).Read().ToList();
            watch.Stop();
            times.Add(watch.Elapsed.TotalMilliseconds);
        }
    }
    ShowTime(times);
}

それで、このDapperのコードと速度を比べてみます。

[TestMethod]
publicvoid 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 = @Id;", new { Id = 1 }).ToList();
            watch.Stop();
            times.Add(watch.Elapsed.TotalMilliseconds);
        }
    }
    ShowTime(times);
}

結果は・・・

良くなってきたのですが、LambdicSqlの方は、たまに重い時がある。Dapperの方は何回かやってみても、これがないんですよねー。

(msec)LambdicSqlDapper
12.41312.1083初回はいいとして
20.84550.7581
30.82990.745
40.83810.7671
50.82540.7499
60.83150.7466
70.81680.7483
83.01120.7429※なにこれ?
90.91520.7503
平均1.2585222220.901833333


そろそろプロファイラ使うか。

もっと真面目な計測は?

とりあえず、ここを超えたら、もう少し真面目にやります。
(まだお手本のDapperのテストプロジェクトのビルド通せてない)


Viewing all articles
Browse latest Browse all 104

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>