2009-09-27 5 views
1

Vous avez une question sur la façon de mieux optimiser ou accélérer les choses. À l'heure actuelle mon code semble fonctionner un peu lent ...C# .net décorateur modèle convertir/mise en collection

Je les classes suivantes

public class DataFoo : IFoo { } 

public class Foo 
{ 
    internal IFoo UnderlyingDataObject{get;set;} 

    public Foo(IFoo f) 
    { 
      UnderlyingDataObject = f; 
    } 
} 

Maintenant, dans bien des cas, je finis par avoir besoin ou appeler une méthode qui fournira de nouveau une liste. Cette méthode sera d'abord obtenir un tableau d'objets DataFoo et tous les objets itérer retournés instancier un nouvel objet Foo passant dans le DataFoo ... Voici un exemple ...

public List<Foo> GetListOfFoo(Guid id) 
{ 
    DataFoo[] q = GetArrayOfDataFoo(id); 
    List<Foo> rv = new List<Foo>(); 

    for(var i = 0; i < q.Length; i++) 
    { 
      rv.Add(new Foo(q[i])); 
    } 
    return rv; 
} 

Le problème est que d'avoir à itérer sur et instancier comme ça semble assez lent. J'étais curieux de savoir si quelqu'un pourrait avoir des suggestions sur la façon d'accélérer cela ...

+2

Avez-vous profils votre code pour vérifier que a) il est lent et b) ce code est le goulot d'étranglement? – ChrisF

+0

je convertis le code d'une implémentation linq en sql existante à cette approche en utilisant nhibernate/fluent nhibernate ... d'après ce que je vois en comparant les deux versions; le nouveau code est plus lent. qui est plus lent soit parce que nhibernate a été introduit ou à cause de toutes les boucles for qui se produisent ... – Jason

+1

Utilisez un profileur pour vérifier les goulets d'étranglement de performance - pas de devinettes; ils sont rarement là où vous vous attendez. Je m'attendrais à ce que le changement de fournisseur ORM soit beaucoup plus important que la performance en boucle. –

Répondre

3

Tout d'abord, vous devez le profil attentivement. Chaque fois que vous regardez la performance, n'essayez pas de deviner ce qui se passe - mesurez tout. Vous serez, plus souvent qu'autrement, surpris par la vérité.

Votre définition GetListOfFoo pourrait être améliorée légèrement pour éviter Redimensionnement inutile du List<Foo> en spécifiant la capacité initiale:

DataFoo[] q = GetArrayOfDataFoo(id); 
List<Foo> rv = new List<Foo>(q.Length); 

Mais à moins que vous avez affaire à des réseaux très grandes et vous concernant avec des périodes très petites de temps, alors cela ne fera pas beaucoup de différence.

Il n'y a rien dans le modèle de décorateur que vous utilisez qui devrait sensiblement améliorer votre performance, à moins que vous ne parliez de millions de mises à jour par seconde ou microsecondes. Je voudrais voir ce que fait GetArrayOfDataFoo. Je suppose que votre problème se produit en dehors de ce que vous nous avez montré.

+0

Cheers; J'ai raté la conversion ;-p –

+0

GetArrayOfDataFoo utilise couramment nhibernate/nhibernate et linq pour nhibernate pour simplement faire un appel Linq à la base de données et récupérer un tableau d'objets ... – Jason

+0

Ensuite, je concentrerais votre énergie sur cette zone de votre code, plutôt que le motif décorateur ou la conversion. C'est juste la pointe de l'iceberg. Utilisez un profileur pour découvrir ce qui se passe. Je crois qu'Ayende Rahien a un profileur NHibernate, mais je ne l'ai pas utilisé moi-même. –

Questions connexes