2010-03-14 3 views
1

Je travaille sur un outil pour optimiser les requêtes linq to sql. Fondamentalement, il intercepte le pipeline d'exécution linq et effectue certaines optimisations, comme par exemple supprimer une jointure redondante d'une requête. Bien sûr, il y a une surcharge dans le temps d'exécution avant que la requête ne soit exécutée dans le dbms, mais ensuite, la requête devrait être traitée plus rapidement. Je ne veux pas utiliser un profileur sql car je sais que la requête générée sera plus performante dans les dbms que dans l'original, je cherche une façon correcte de mesurer le temps global entre la création de la requête dans linq et la fin de son exécution. À l'heure actuelle, je suis en utilisant la classe Chronomètre et mon code ressemble à ceci:Besoin de conseils sur la comparaison des performances de 2 requêtes linq-sql équivalentes

var sw = new Stopwatch(); 
sw.Start(); 
const int amount = 100; 
for (var i = 0; i < amount; i++) 
{ 
    ExecuteNonOptimizedQuery(); 
} 
sw.Stop(); 
Console.Writeline("Executing the query {2} times took: {0}ms. On average, each query took: {1}ms", sw.ElapsedMilliseconds, sw.ElapsedMilliseconds/amount, amount); 

Fondamentalement, la méthode ExecutenNonOptimizedQuery() crée une nouvelle DataContext, crée une requête, puis itère sur les résultats.

Je l'ai fait pour les deux versions de la requête, la normale et la version optimisée. J'ai pris l'idée de this poste de Frans Bouma.

Y a-t-il d'autres approches/considérations que je devrais prendre?

Merci d'avance!

Répondre

1

Vous pouvez exécuter sous un profileur. Mais une construction instrumentée aura un impact sur les performances du code, déformant éventuellement le résultat (avec une grande partie du temps d'exécution total dans SQL Server, c'est très probable). Un profileur d'échantillonnage pourrait aider. (Le profileur Visual Studio Team System peut faire les deux.)

Pour un test isolé à comparer aux approches utilisant Stopwatch est généralement l'approche préférée. Vous pouvez supprimer l'affichage de l'heure dans SQL Profiler à partir de l'heure du chronomètre pour obtenir l'heure dans le code client (y compris votre post-traitement).

+0

Merci pour votre réponse! – uvita

Questions connexes