2011-02-18 4 views
4

Bon, je sais que je dois faire quelque chose de mal ici parce que les temps de performance que j'obtiens sont si différents que cela choque. J'ai envisagé d'utiliser la première option de l'entité dans un projet existant, alors j'ai essayé de faire un test de performance juste pour voir comment il se compare. J'utilise MSpec pour exécuter les tests sur une base de données de développement à distance.CTP5 Code EF Premier vs Linq-to-sql

Voici mes tests:

public class query_a_database_for_a_network_entry_with_linq : ipmanagement_object { 
    protected static NetINFO.IPM_NetworkMaster result; 
Because of =() => { 
    var db = new NetINFODataContext(); 
    result = db.IPM_NetworkMasters.SingleOrDefault(c => c.NetworkID == 170553); 
}; 

It should_return_an_ipm_networkmaster_object =() => { 
    result.ShouldBeOfType(typeof(NetINFO.IPM_NetworkMaster)); 
}; 

It should_return_a_net_ou_object_with_a_networkid_of_4663 =() => { 
    result.IPM_OUIDMaps.First().NET_OU.NET_OUID.ShouldEqual(4663); 
}; 

}

public class query_a_database_for_a_network_entry_with_entity_code_first : ipmanagement_object { 
    protected static NetInfo.Core.Models.CTP.IPM_NetworkMaster result; 

    Because of =() => { 
     NetInfo.Core.Models.CTP.NetInfoDb db = new NetInfo.Core.Models.CTP.NetInfoDb(); 
     result = db.IPM_NetworkMasters.SingleOrDefault(c => c.NetworkID == 170553); 
    }; 

    It should_return_an_ipm_networkmaster_object =() => { 
     result.ShouldBeOfType(typeof(NetInfo.Core.Models.CTP.IPM_NetworkMaster)); 
    }; 

    It should_return_a_net_ou_object_with_a_networkid_of_4663 =() => { 
     result.NET_OUs.First().NET_OUID.ShouldEqual(4663); 
    }; 
} 

Comme vous pouvez le voir sur la datacontext avec LINQ to SQL Je ne peux pas accéder à l'objet directement qui ont un plusieurs à plusieurs relation. Je dois utiliser la table de recherche intermédiaire. Ce qui est l'une des choses que j'aime dans Entity framework. Cependant, lorsque j'exécute ces tests, le test linq ne prend jamais plus de 4 secondes à compléter (la base de données est distante). Où le test d'entité prend presque 8 secondes à chaque fois. Pas sûr pourquoi il y a une telle différence énorme ?? Voici des extraits de mes classes POCO et mon dbcontext:

DbContext:

public class NetInfoDb : DbContext { 
     public NetInfoDb() : base("NetINFOConnectionString") { } 
     public DbSet<IPM_NetworkMaster> IPM_NetworkMasters { get; set; } 
     public DbSet<IPM_NetworkType> IPM_NetworkTypes { get; set; } 
     public DbSet<NET_OU> NET_OUs { get; set; } 

     protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) { 
      modelBuilder.Entity<IPM_NetworkMaster>() 
        .HasMany(a => a.NET_OUs) 
        .WithMany(b => b.IPM_NetworkMasters) 
        .Map(m => { 
         m.MapRightKey(a => a.NET_OUID, "NET_OUID"); 
         m.MapLeftKey(b => b.NetworkID, "NetworkID"); 
         m.ToTable("IPM_OUIDMap"); 
        }); 
     } 

    } 

IPM_NetworkMaster:

public class IPM_NetworkMaster { 
     public int NetworkID { get; set; } 
     <snip>    
     public virtual ICollection<NET_OU> NET_OUs { get; set; } 

    } 

NET_OU:

public class NET_OU { 
     public int NET_OUID { get; set; } 
     <snip> 
     public virtual ICollection<IPM_NetworkMaster> IPM_NetworkMasters { get; set; } 
    } 
+1

Je vous conseille d'utiliser http://sites.google.com/site/sqlprofiler/ pour vérifier les requêtes envoyées à la base de données. – LukLed

+0

Sans blague. Vous avez vraiment besoin de profiler à la fois l'application et le SQL. –

+0

Comme indiqué ci-dessus, vous devez vraiment exécuter SqlProfiler pour voir la différence dans les requêtes. Si vos entités EF4 sont des associations de chargement enthousiastes et que vos entités L2S ne le sont pas, il y aura une énorme différence de performance. – mikesigs

Répondre

1

Comme tout le monde l'a dit, vous devez profilez vos requêtes. En supposant que vous utilisez SQL Server, vous pouvez simplement mettre en file d'attente SQL Server Profiler et comparer les requêtes et les plans d'exécution.

Comme pour tout problème de performances, vous devez d'abord mesurer. Avec votre scénario, vous devez en faire plus. Vous devez mesurer deux fois avec chaque technologie et assurez-vous de comparer les pommes aux pommes. Si vous pouvez exclure le sql étant généré, vous devrez alors mesurer le code de l'application, pour éventuellement régir les goulots d'étranglement là.

Je pense que ce seront les requêtes générées.