Soma 0.12.0.0 リリース
F#で作ったO/Rマッパー Soma 0.12.0.0をリリースしました(F#はもちろんC#やVB.NETでも使えます)。ぜひお試しください。
Release Notes
- Change - IDbConfig.Parse メソッドが IDbConfig.Parser プロパティに置き換えられました。
- Change - IDbConfig.Log メソッドが IDbConfig.Logger プロパティに置き換えられました。
- Change - Find と Query のパフォーマンスが改善されました。
- Fix - サテライトアセンブリが正しくロードされるようになりました。
IDbConfigですが、Log出力の方法を変更しました。使い方はドキュメント参照ください。
それから、さらなるパフォーマンス改善をしました。詳細はちょっと後で述べます。
サテライトアセンブリ Soma.Core.resources.dll が正しくロードされるようにしました。本体の Soma.Core.dll に署名をしているですが、サテライトアセンブリには署名できていなかったことに気づきました。署名されていないサテライトアセンブリは署名されたアセンブリと一緒にロードされない仕組みなっているらしく、これまで日本語のエラーメッセージが表示できていませんでした。今回から、本体のアセンブリはもちろんサテライトアセンブリもちゃんと署名するようにしました。日本語環境で使いやすくなっていると思います(エラーメッセージが日本語で表示されるはずです)。
リリースノートには書いていないですが、psakeを使ったビルドスクリプトを利用するようにしました。これについても後ろのほうでもう少し述べます。
他のO/Rマッパーとの比較
前回のエントリで、前バージョンのSoma 0.11.0.0を他のO/Rマッパーと比較しましたが、そんなに速くないじゃんと言われてしまい、もう少しがんばってみました。その結果、劇的にとはいきませんでしたがさらに改善できました。テスト方法は前回のエントリに書いたとおりです。
以下に前回の結果と今回の結果を示します。
Soma 0.11.0.0と他のO/Rマッパーとの比較
順位 | O/R マッパー | 時間 |
---|---|---|
1 | hand coded took | 149ms |
2 | Mapper Query took | 151ms |
3 | PetaPoco (Fast) took | 151ms |
4 | PetaPoco (Normal) took | 154ms |
5 | Dynamic Massive ORM Query took | 158ms |
6 | Dynamic Mapper Query took | 160ms |
7 | BLToolkit took | 187ms |
8 | Linq 2 SQL Compiled took | 192ms |
9 | Simple.Data took | 195ms |
10 | SubSonic Coding Horror took | 218ms |
11 | Entity framework CompiledQuery took | 229ms |
12 | NHibernate SQL took | 242ms |
13 | Soma : Find took | 278ms |
14 | NHibernate HQL took | 285ms |
15 | Linq 2 SQL ExecuteQuery took | 320ms |
16 | Soma : Query took | 347ms |
17 | Linq 2 SQL took | 850ms |
18 | Entity framework ExecuteStoreQuery took | 920ms |
19 | Entity framework ESQL took | 964ms |
20 | Entity framework took | 1225ms |
21 | Entity framework No Tracking took | 1245ms |
22 | SubSonic ActiveRecord.SingleOrDefault took | 4785ms |
Soma 0.12.0.0と他のO/Rマッパーとの比較
順位 | O/R マッパー | 時間 |
---|---|---|
1 | hand coded took | 152ms |
2 | Mapper Query took | 154ms |
3 | PetaPoco (Fast) took | 154ms |
4 | PetaPoco (Normal) took | 159ms |
5 | Dynamic Massive ORM Query took | 160ms |
6 | Dynamic Mapper Query took | 161ms |
7 | Simple.Data took | 176ms |
8 | BLToolkit took | 186ms |
9 | Linq 2 SQL Compiled took | 192ms |
10 | SubSonic Coding Horror took | 210ms |
11 | Soma : Find took | 214ms |
12 | NHibernate SQL took | 223ms |
13 | Entity framework CompiledQuery took | 224ms |
14 | NHibernate HQL took | 269ms |
15 | Soma : Query took | 279ms |
16 | Linq 2 SQL ExecuteQuery took | 313ms |
17 | Linq 2 SQL took | 769ms |
18 | Entity framework ExecuteStoreQuery took | 882ms |
19 | Entity framework ESQL took | 890ms |
20 | Entity framework took | 1117ms |
21 | Entity framework No Tracking took | 1124ms |
22 | SubSonic ActiveRecord.SingleOrDefault took | 4654ms |
比較からわかることは
- Findの順位が前回の13位から11位へ
- Queryの順位が前回の16位から15位へ
まぁ、順位だけで見るとほんの少しの改善ですね。。。時間で見ると結構改善されていますが、誤差もあるのでここではあんまり重要視しないことにします。数msしか差がないところはたまに順位が入れ替わりますが相対的な順位のほうが安定しています。
引き続き改善していこうと思います。ちなみに、今回はdotTraceを使ってプロファイリングしてちゃんと効果がある改善作業を行いました。
psakeを使ったビルド
これまで、Visual Studioからビルドしてきましたが、そろそろ面倒になってきたのでビルドツールを利用することにしました。
ちょっと調べてみると海外ではpsakeというPowershellで書かれたツールが人気らしいということで、psakeを使うことにしました。日本酒の「サケ」と同じ発音だそうです。作者のブログにあるロゴも日本酒だったりします:-)
ごく単純なことしかしませんでしたが、非常に使い勝手がいい印象です。Powershellでできることならなんでもできるところがいいですね。普段Powershellはまったく使いませんが、Powershellも使ってみるとなかなか面白い言語です。
60行程度で、アセンブリのバージョン番号更新、テスト、ビルド、パッケージングの自動化が実現できました。
基本的にはJson.NETのビルドスクリプトを参考にしました。
Json.NETのビルドスクリプトは、NugetやILMergeを使うタスクがあったり、.NET Frameworkのバージョンを指定してビルドしたりと、まだいろいろと参考になりそうです。
検索をかけるとどうも日本語情報が少ないのですが、プロダクト名が日本酒にちなんでいるということもありますし、日本でももっと使われていい便利なツールだと思います。