Interessante comparação entre as implementações do JPA, aparentemente o Hibernate levou a melhor, vejam as conclusões do autor :
[quote]My intention is that anyone can draw their own conclusions looking at the results or using the code to do a test of their own.
Nevertheless, I consider that there are a number of conclusions that one can draw watching the monitored data:
There is not an implementation that clearly has the best performance. Some had a very good CPU or memory performance and some did it very well when inserting or querying. But none of them was outstanding as a whole.
The number of records inserted by Hibernate was extremely higher than it was for any other implementation (4 times more compared to Eclipselink and 24 times more compared to OpenJPA). However, Hibernate was also the JPA implementation that executed the lowest number of queries, although the differences in this value (3080 for Hibernate vs 3740 for Toplink Essentials) are not so extreme as for the number of inserts.
Hibernate was also the implementation that consumed more memory. But having into account that it inserted many more records than the others, it sounds reasonable.
OpenJPA had the lowest value of inserts+queries.
The number of inserts executed by OpenJPA was extremely low, compared to the others.
The usage of CPU in the case of Toplink Essentials and Eclipselink was extremely low.[/quote]
Pelo que eu entendí ele fez a aplicação rodar durante o mesmo tempo para verificar que algumas implementações fizeram mais queries/inserções que outras e verificou a memória utilizada. O problema é que como o hibernate foi mais rápido, ele teve mais tempo para fazer inserções e isso deve ter consumido mais memória. Se o teste fosse fosse feito com o mesmo número de operações para as diferentes implementações independente do tempo, talvez o hibernate não teria alocado tanta memória.
Discordo do resultado. O hibernate sem dúvida foi muito rápido nos inserts, mas em bases de dados, selects são muito mais comuns do que inserts, e neste quesito, o hibernate ficou em último.
Além do mais, o teste não considera updates e deletes (embora estes sejam relativamente raros).
Além disso, como escrito nos comentários, cada implementação tem um monte de parâmetros que deveriam ser tunados para a aplicação, e o benchmark não fala nada sobre eles.
E realmente, o OpenJPA precisa de umas boas otimizações no insert. É estranho que o select seja mais rápido do que um insert, uma vez que insert é uma operação muito mais simples. Ou mais provavelmente isso seja efeito da forma como transações concorrentes são gerenciadas.
Lembro-me na faculdade quando fiz comparações assim, executando e o professor me deu um sermão. A explicação dele foi que não depende exclusivamente de nossos programas sendo executados, mas também de como o sistema operacional aloca os recursos. E que fazer isso era um tipo péssimo de comparação.