UPDATE 1: I made clear that NH actually performs better in those posts, when a simple optimization such as Enabled Batching.
UPDATE 2: Please check Ayende's latest post for how those benchmarks can be made fair.
I am a bit late to the party but there we go.
Last several days, there have been a hot debate on the performance and capability of NH vs some other commercial/noncommercial ORMs. This issue has been discussed both in NHibernate Developer List and in Ayende’s blog. I have recently noticed another benchmark between NH and EF, which I hope to address, too.
Fallacies of benchmark
What I have seen in those benchmarks is the wrong use of ORMs. This statement has two aspects: Wrong use of ORM and wrong use of NH itself.
In ORM, you don’t use it to do bulk operations. And 0.001 second difference will not differ anything in your application. If it does, you don’t also use RDBMS, you use something else.
There is no point on making a loop of thousands of iterations which saves an entity. Davy has well pointed out that this has a lot of implications in NHibernate, unlike some other ORMs. First of all, NHibernate first-level cache will be in action and it will fill the cache with each item saved. Secondly, as NH makes use of POCO it has no mechanism of things like INotifyPropertyChanged, it has to compare the old to the new value. As you may guess, the more entity you have, the longer it will take. No exception. If you want to leave first-level cache out of the game, you use StatelessSession feature of NHibernate, no exception. Actually when you check Fabio Maulo’s post you’ll see it can even become faster without Stateless Session.
Another point I have noticed in both benchmarks is that they are/were not fair. If I compare it to EF, lets say, ctx.SaveChanges() will batch the chages and send the query to the database in one go. NH has this feature, as Ayende already pointed out, since 2006. However, NH by default doesn’t make use of it, and this is not a bug, it is a feature. You have to use setting to enable it.
Gergely Orosz has made his own benchmark and didn't use batching support and NH fell well behind of EF. I contacted him and he was kind enough to discuss the issues. I showed him how to enable batching and why not to flush everytime, as it wouldn't be fair. Now NH performs much better and he said he will update his post.
Benchmark the community, too
NHibernate has a big community, and great minds as committers. It really does matter. Let me give you some statistics about NHibernate development and its community
Here is the commit statistics.
It is one of the most active projects in .net environment. The image above doesn’t include the contrib projects. A great kiss goes to Fabio Maulo for his massive efforts.
Let’s look at discussion group, shall we?
Do you know any other group with that activity? I don’t know.
In addition, NHibernate gives you more than _ANY_ ORM can give. It gives you a lot of extensibility points which can be used in a lot of scenario. Validator, Search, Spatial, Shards to name a few.
NHibernate is the obvious winner.
08-21-2009 7:27 PM