2010-06-27 3 views
4

Je viens de recevoir un code. Le code est écrit en C# et il insère des données en temps réel dans la base de données chaque seconde. Les données sont accumulées dans le temps ce qui rend les chiffres importants.Comment ce code peut-il être optimisé?

Les données sont mises à jour dans la seconde plusieurs fois puis à la fin du deuxième résultat est pris et inséré.

Nous avions l'habitude d'adresser les rangées de jeu de données directement dans la seconde à travers les propriétés. Par exemple beaucoup d'opérations comme celle-ci 'datavaluerow.meanvalue + = mean; pourrait avoir lieu. nous avons découvert que cela dégrade les performances après l'exécution du profileur car la fusion interne a été effectuée, donc nous avons créé un tableau de décimales 2d sur lequel les mises à jour sont effectuées, puis les valeurs sont assignées aux datarows seulement à la fin de la seconde. J'ai couru un profileur et j'ai découvert que cela prenait encore beaucoup de temps (bien que moins que le temps passé à accéder fréquemment aux datarows).

Le code qui est exectued à la fin de la seconde est la suivante

public void UpdateDataRows(int tick) 
{ 
    //ord 
    //_table1Values is of type decimal[][] 
    for (int i = 0; i < _table1Values.Length; i++) 
    { 
    _table1Values[i][(int)table1Enum.barDateTime] = tick; 
    table1Row[i].ItemArray = _table1Values[i].Cast<object>().ToArray(); 

    } 
    // this process is done for other 10 tables    
} 

Est-il possible d'améliorer encore cette approche.

+0

Où votre profilage montre-t-il le plus de temps passé? – Oded

+0

Récupère la distribution (int) table1Enum.barDateTime hors de la boucle. –

+0

@ Oded, la plupart du temps est consacré à l'opération de coulée – mustafabar

Répondre

4

Une question évidente: pourquoi avez-vous un tableau 2D de décimales lorsque vous ne faites que les mettre à jour avec des entiers? Pourriez-vous sortir avec un int[][] à la place?

Ensuite, pourquoi accédez-vous à (int)table1Enum.barDateTime à chaque itération? Étant donné qu'il y a une conversion impliquée là-bas, peut trouver cela utile si vous extrayez cela hors de la boucle.

Cependant, je soupçonne que la majorité du temps va être passé en _table1Values[i].Cast<object>().ToArray(). Avez-vous vraiment besoin de faire ça? Prenant une copie du decimal[] (ou int[]) serait plus rapide que la boxe chaque valeur à chaque itération sur chaque appel - et ensuite créer un autre tableau.

+0

Nous envisageons de changer la décimale en uint et bien sûr cela améliorera l'utilisation de la mémoire et les performances. Cependant, le temps est nécessaire pour convertir le nombre décimal en objet. ItemArray est de type objet. Comment puis-je mettre à jour les lignes de données sans le faire? – mustafabar

+1

@Mustafa: Le fait que 'ItemArray' soit de type' object' ne signifie pas que vous devez avoir un objet * array *. Tout tableau est un objet lui-même. Vous devez considérer s'il faut prendre une copie du tableau, attention. –

+0

copie toujours le tableau prend le même temps. La chose est que la ligne prend environ 20 ms en moyenne mais nous répétons ce processus pour d'autres tables qui se terminent autour de 300 ms! le délai est très critique dans nos données. J'ai trouvé que ce processus était un gros goulot d'étranglement – mustafabar