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

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

LightSpeed ORM のパフォーマンスを簡単に調べてみた

のいえ先生が neue cc - C#のO/Rマッパーのパフォーマンス測定 Part2 で調べていた中には LightSpeed が無かったので、同じように Dapper のベンチマークを使って調べてみました。

ベンチマークの実行結果は以下のような感じ。

hand coded took 108ms
Dynamic Mapper Query (buffered) took 110ms
Mapper Query (buffered) took 111ms
OrmLite QueryById took 112ms
PetaPoco (Fast) took 114ms
DataTable via IDataReader.GetValues took 114ms
Dapper.Cotrib took 115ms
Dynamic Massive ORM Query took 119ms
PetaPoco (Normal) took 121ms
LightSpeed 4 took 126ms
BLToolkit took 133ms
Simple.Data took 142ms
Linq 2 SQL Compiled took 152ms
Dynamic Mapper Query (non-buffered) took 165ms
Mapper Query (non-buffered) took 168ms
SubSonic Coding Horror took 173ms
NHibernate SQL took 176ms
NHibernate Session.Get took 177ms
NHibernate HQL took 186ms
Entity framework CompiledQuery took 191ms
Soma took 202ms
NHibernate Criteria took 215ms
Linq 2 SQL ExecuteQuery took 248ms
Entity framework No Tracking took 258ms
Entity framework took 267ms
Entity framework ESQL took 270ms
Linq 2 SQL took 571ms
NHibernate LINQ took 581ms
Entity framework ExecuteStoreQuery took 626ms
SubSonic ActiveRecord.SingleOrDefault took 3195ms

ORM の中では確かに最速っぽいですね。

しかしながら、ここには一つのトリックが存在しているのでした。今回使ったコードは以下のような感じです。

var context = new Mindscape.LightSpeed.LightSpeedContext<LightSpeed.LightSpeedModel1UnitOfWork>("Default");
var uow = context.CreateUnitOfWork();

tests.Add(id => uow.FindById<LightSpeed.Post>(id), "LightSpeed 4");

ご覧の通り LINQ 使ってません。はい、そういうことです。クエリのコンパイルを行っていないので速いのでした。しかし、プライマリキーに関してはこれでもいいんじゃないかなぁと思います。

しかしながら、先日公開された LightSpeed 5 には LINQ の自動コンパイル機能など、いろいろとクエリのパフォーマンスを上げるための仕組みが用意されているので、また今度試してみたいですね。