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のバージョンを指定してビルドしたりと、まだいろいろと参考になりそうです。

検索をかけるとどうも日本語情報が少ないのですが、プロダクト名が日本酒にちなんでいるということもありますし、日本でももっと使われていい便利なツールだと思います。