In un blog di qualche tempo fa avevo messo a confronto le prestazioni tra Linq e l'Entity Framework in scrittura (e lettura). Anche in questo caso moltissime persone (una) mi hanno chiesto come si comportasse Nhibernate nel confronto.
Innanzitutto, prima di sentenziare verità assolute che non possiedo, premetto che NON sono affatto un esperto di Nhibernate: con esso ho solo giocato in piccole applicazioni di test per testare le prestazioni di questo famoso e ottimo ORM.
Per evitare discussioni riposto la struttura del database e i file di configurazione utilizzati nel mio test, in modo che gente più esperta di me di questo ORM, possa segnalarmi eventuali errori:
Ed ecco i file di mapping usati per Nhibernate. Per la tabella Padri:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="EntitiesX"
namespace="EntitiesX"
default-lazy="false"
>
<class name="Padri" table="Padri">
<id name="Id" unsaved-value="0" >
<generator />
</id>
<property name="NomePadre" />
<bag name="Figli" cascade="all-delete-orphan"
generic="true" lazy="false" inverse="true"
fetch="join">
<key column="IdPadre" />
<one-to-many />
</bag>
</class>
</hibernate-mapping>
Per la tabella Figli:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="EntitiesX"
namespace="EntitiesX"
default-lazy="false"
>
<class name="Figli" table="Figli">
<id name="Id" unsaved-value="0" >
<generator />
</id>
<property name="NomeFiglio" />
<many-to-one name="Padri" column="IdPadre" />
</class>
</hibernate-mapping>
Per l'inserimento ho usato questo banale codice:
using (ISession session =sessionFactory.OpenSession() )
{
foreach (var padre in coll) session.SaveOrUpdate(padre);
session.Flush();
}
Come nel blog precedente, innanzitutto sono state create cento entity Padri, con ognuna di essa cento entity Figli.
Ecco la tabella prestazionale definitiva (rifatta con il carico attuale del computer):
Stored procedure | Linq To Sql | Entity Framework | Nhibernate |
6.85s | 24,10 | 14,68 | 13,87 |
Nhibernate, dall'alto dei suoi anni di sviluppo, batte entrambe le tecnologie Microsoft anche se di poco.
Ora vediamo come si portano tutti in lettura. Il codice ripopola tutti gli oggetti con il contenuto delle tabelle. Nel caso di Nhibernate, il codice è il seguente:
using (ISession session = sessionFactory.OpenSession())
{
IList<EntitiesX.Padri> coll=session.CreateCriteria(typeof(EntitiesX.Padri)).List<EntitiesX.Padri>();
// Check collections
}
Ed ecco i risultati:
Linq To Sql | Entity Framework | Nhibernate |
0,31s | 0,91s | 0,65s |
L'Entity Framework ne ha da strada da fare sul suo diretto e storico rivale...
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- UrlRewriting con trabocchetti vari, l'11 dicembre 2007 alle 21:00
- Windows Forms - DataGridView e validazione, il 23 settembre 2007 alle 20:08
- ControlParameter e masterpage... bug?, il 23 dicembre 2006 alle 15:58
- Se Visual Studio 2005 non accetta più la tastiera, il 16 dicembre 2006 alle 20:45
- Service Pack 1 di Visual Studio 2005, il 16 dicembre 2006 alle 20:35