2017-02-03 1 views
0

J'ai une boucle for qui prend beaucoup trop de temps et je ne sais pas pourquoi.problèmes de diagnostic du temps passé dans une boucle for C#

Stopwatch proctime = new Stopwatch(); 
Stopwatch innerlooptime = new Stopwatch(); 
Stopwatch outerlooptime = new Stopwatch(); 

proctime.Start(); 
int length = inbtable.Rows.Count; 
outerlooptime.Start(); 
for (int i = 0; i < length; i++) 
{ 
    outerlooptime.Stop(); 
    DataRow newrow = graphdata.NewRow(); 
    innerlooptime.Start(); 
    for (int j = 0; j < graphdata.Columns.Count; j++) 
    { 
     colname = graphdata.Columns[j].ColumnName; 
     newrow[j] = inbtable.Rows[i][colname]; 
    } 
    innerlooptime.Stop(); 
    outerlooptime.Start(); 
    graphdata.Rows.Add(newrow); 
} 
proctime.Stop(); 

si vous le temps tout dehors, le temps passé sur juste la « boucle interne » ou la j-boucle est comme 1/10e de seconde.

le temps passé à l'intérieur de la boucle i, mais pas la boucle j est comme 1/10ème de seconde.

le temps passé sur la boucle totale est d'environ 1 seconde. donc Time-iloop + Time-jloop est comme 1/5ème du temps total. Où est passé le reste du temps? jetez un oeil à l'image, en comparant le temps de traitement (proctime dans le code), le temps de boucle externe et le temps de boucle interne. pourquoi ne pas ajouter à quelque chose de plus proche les uns des autres?

enter image description here

+2

vous commencez externallooptime en dehors de la première boucle, mais l'arrêter dès que la boucle commence? –

+2

Si vous utilisez Visual Studio, essayez d'exécuter le profileur de performances avec les symboles Microsoft activés (options -> débogage -> symboles). Le "hotpath" produit par un profil cpu devrait indiquer quels appels prennent le plus de temps. –

+0

James, ça ressemble exactement à ce dont j'ai besoin. Merci! Je vais essayer maintenant – metinoheat

Répondre

1

Vous ne présentez pas les déclarations de vos minuteries, mais les noms de variables impliquez que vous regardez le temps processeur, pas le montant réel des dépenses de temps. Le temps processeur est le temps passé par le coeur du processeur à exécuter vos calculs - le processeur est partagé entre tous les processus en cours d'exécution sur votre ordinateur, donc en 1 seconde, il est parfaitement raisonnable de recevoir 0,2 secondes de temps processeur.

Essayez d'utiliser la classe Chronomètre à la place:

// using System.Diagnostics; 
Stopwatch sw = new Stopwatch(); 
sw.Start(); 

DoThings(); // run your code 

sw.Stop(); 
Debug.WriteLine("Actual time elapsed: " + sw.Elapsed.ToString()); 
+0

Ils sont en fait chronomètres, j'ai marqué proctime comme temps de traitement pour la boucle. – metinoheat

+1

Désolé, mauvaise supposition de ma part. Peut-être que 'DataRow newrow = graphdata.NewRow();' prend beaucoup de temps - il ne semble pas être compté dans les deux boucles. Le temps passé à instancier des objets n'est pas négligeable ... –

0

je me suis dit la réponse. c'était vraiment stupide. J'ai fait changer les chronomètres dans ma déclaration de boîte de message à la fin de la fonction, donc un chronomètre a été signalé comme un autre. tout le temps est passé ailleurs, en dehors du code que j'ai posté. Merci pour toute votre aide.