Un po' di benchmark tra Linq, Entity Framework e Nhibernate

di Andrea Zani, in .NET2,

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:

struttura tabelle

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...

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese