Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

WCF Data Services vs WAQS – Comparatif de performance

La raison initiale pour laquelle j’ai fait WAQS était la limitation de WCF Data Services et de WCF RIA Services en terme de requêtage.

Depuis WAQS a beaucoup évolué et son périmètre est devenu beaucoup plus important.

A ce propos, je vous invite à me contacter ou à passer me voir sur le stand Infinite Square aux TechDays si vous voulez en savoir plus.

Ayant récemment procédé à quelques optimisations sur WAQS, j’ai voulu faire le test vs WCF Data Services pour voir si le gain de fonctionalités ne se faisait pas au détriment de la performance.

J’ai donc effectué des requêtes simples sur la base Contoso qui a l’avantage d’être plus fournie que Northwind.

A noter, que, dans le cas de WAQS comme dans le cas de WCF Data Services, je suis resté sur le mode par défaut.

 

Voici les résultats obtenus avec WCF Data Services

  • Récupération des 18 869 clients de la base : 6 693 ms
    var query = _context.DimCustomers;
    var customers = (await Task.Factory.FromAsync(query.BeginExecute(null, null),
        ar => query.EndExecute(ar))).ToList();
  • Récupération des CompanyName des clients : 2 652 ms
    var query = (DataServiceQuery<DimCustomer>)_context.DimCustomers
        .Select(c => new DimCustomer { CustomerKey = c.CustomerKey, CompanyName = c.CompanyName });
    var customers = (await Task.Factory.FromAsync(query.BeginExecute(null, null),
        ar => query.EndExecute(ar)))
        .Select(c => c.CompanyName).ToList();
  • Récupération de 100 clients avec leurs ventes en ligne : 9 672 ms
    var query = (DataServiceQuery<DimCustomer>)_context.DimCustomers
        .Expand("FactOnlineSales")
        .Take(100);
    var customers = (await Task.Factory.FromAsync(query.BeginExecute(null, null),
        ar => query.EndExecute(ar))).ToList();
  • Récupération de 100 clients avec leurs ventes en ligne et les produits de celles-ci : 27 021 ms
    var query = (DataServiceQuery<DimCustomer>)_context.DimCustomers
        .Expand("FactOnlineSales/DimProduct")
        .Take(100);
    var customers = (await Task.Factory.FromAsync(query.BeginExecute(null, null),
        ar => query.EndExecute(ar))).ToList();
  • Récupération de 100 clients avec leurs ventes en ligne, les produits de celles-ci et les catégories de ceux-ci : 42 604 ms
    var query = (DataServiceQuery<DimCustomer>)_context.DimCustomers
        .Expand("FactOnlineSales/DimProduct/DimProductSubcategory/DimProductCategory")
        .Take(100);
    var customers = (await Task.Factory.FromAsync(query.BeginExecute(null, null),
        ar => query.EndExecute(ar))).ToList();
  • Récupération de 200 clients avec leurs ventes en ligne, les produits de celles-ci et les catégories de ceux-ci : Exception !
    var query = (DataServiceQuery<DimCustomer>)_context.DimCustomers
        .Expand("FactOnlineSales/DimProduct/DimProductSubcategory/DimProductCategory")
        .Take(200);
    var customers = (await Task.Factory.FromAsync(query.BeginExecute(null, null),
        ar => query.EndExecute(ar))).ToList();

Maintenant faisons la même chose avec WAQS :

  • Récupération des 18 869 clients de la base : 3 307 ms (au lieu de 6 693 ms)
    var customers = (await _context.DimCustomers.AsAsyncQueryable().Execute()).ToList();
  • Récupération des CompanyName des clients : 187 ms (au lieu de 2 652 ms)
    var customers = (await _context.DimCustomers.AsAsyncQueryable()
        .Select(c => c.CompanyName)
        .Execute()).ToList();
  • Récupération de 100 clients avec leurs ventes en ligne : 3 260 ms (au lieu de 9 672 ms)
    var customers = (await _context.DimCustomers.AsAsyncQueryable()
        .OrderBy(c => c.CustomerKey)
        .Take(100)
        .IncludeFactOnlineSales()
        .Execute()).ToList();
  • Récupération de 100 clients avec leurs ventes en ligne et les produits de celles-ci : 4 336 ms (au lieu de 27 021 ms)
    var customers = (await _context.DimCustomers.AsAsyncQueryable()
        .OrderBy(c => c.CustomerKey)
        .Take(100)
        .IncludeFactOnlineSalesWithExpression(
            onlineSales => onlineSales.IncludeDimProduct())
        .Execute()).ToList();
  • Récupération de 100 clients avec leurs ventes en ligne, les produits de celles-ci et les catégories de ceux-ci : 4 883 ms (au lieu de 42 604 ms)
    var customers = (await _context.DimCustomers.AsAsyncQueryable()
        .OrderBy(c => c.CustomerKey)
        .Take(100)
        .IncludeFactOnlineSalesWithExpression(
            onlineSales => onlineSales.IncludeDimProductWithExpression(
                products => products.IncludeDimProductSubcategoryWithExpression(
                    productSubcategories => productSubcategories.IncludeDimProductCategory())))
        .Execute()).ToList();
  • Récupération de 200 clients avec leurs ventes en ligne, les produits de celles-ci et les catégories de ceux-ci : 7 029 ms (au lieu d’une exception)
    var customers = (await _context.DimCustomers.AsAsyncQueryable()
        .OrderBy(c => c.CustomerKey)
        .Take(200)
        .IncludeFactOnlineSalesWithExpression(
            onlineSales => onlineSales.IncludeDimProductWithExpression(
                products => products.IncludeDimProductSubcategoryWithExpression(
                    productSubcategories => productSubcategories.IncludeDimProductCategory())))
        .Execute()).ToList();

Si on ne prends pas en compte le côté infini du ratio de la dernière requête, WAQS est donc entre 2,02 et 14,18 fois plus rapide que WCF Data Services avec une moyenne sur mes tests de 6,83.

Ca va, je suis rassuré… :)

// A noter que la version de WAQS que j’ai utilisé n’est pas encore publique

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié lundi 11 février 2013 01:30 par Matthieu MEZIL

Commentaires

# re: WCF Data Services vs WAQS – Comparatif de performance @ lundi 11 février 2013 16:13

Classe !

Tu assures ! :)

Groc

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Simuler facilement l’envoi de mail par Blog de Jérémy Jeanson le il y a 14 heures et 51 minutes

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29