2017-10-19 9 views
-1

J'ai lu que si le foreach est très simple, le surcoût que j'obtiens pour utiliser le parallèle ne vaut pas le coût. J'ai donc une simple application WPF pour faire quelques tests. J'ai ce code:Pourquoi le temps du parallèle.Foreach c'est haut la première fois et très bas les prochaines fois?

//Parallel.Foreach 
txtLog.Text = txtLog.Text + "\r\n\r\n\r\nSe inicia el Parallel.Foreach a " + DateTime.Now; 
miSw.Restart(); 
Parallel.ForEach(miLstInt, 
    (iteradorInt, state) => 
    { 
     if (iteradorInt >= 500000) 
     { 
      state.Stop(); 
     } 
    }); 
miSw.Stop(); 

txtLog.Text = txtLog.Text + "\r\nTiempo total del Parallel.Foreach: " + miSw.ElapsedMilliseconds.ToString(); 



//Forech 
txtLog.Text = txtLog.Text + "\r\n\r\nSe inicia el foreach a " + DateTime.Now; 
miSw.Restart(); 
foreach (int i in miLstInt) 
{ 
    if (i >= 500000) 
    { 
     break; 
    } 
} 
miSw.Stop(); 
txtLog.Text = txtLog.Text + "\r\nTiempo total del foreach: " + miSw.ElapsedMilliseconds.ToString(); 

J'ai un bouton que lorsque je clique dessus, courir les deux foreach et d'afficher les résultats dans une zone de texte.

Lorsque je cours pour la première fois, parallel foreach dure environ 29ms et dure environ 3ms. Mais la deuxième fois que je l'exécute et les fois suivantes, foreach parallèle prend 0ms et foreach est entre 2 ou 3ms, plus de fois 3 que 2, mais les résultats sont plus stables.

Donc, mon doute est, pourquoi est-ce plus lentement la première fois, mais plus tard est plus rapide? devrais-je tenir compte de cela, si je vais exécuter une commande plusieurs fois, bien que la première fois soit plus lente, cela vaut-il la peine de faire un parallèle si les prochaines fois seront plus rapides?

+2

Je soupçonne fortement que c'est juste du temps JIT régulier parce que vous mesurez le temps de façon moins optimale - https: //stackoverflow.com/questions/457605/how-to-measure-code-performance-in-net ... Considérez juste la fermeture en double si vous êtes d'accord. –

Répondre

1

Parallèle Foreach utilise un pool d'unités d'exécution gérées, de sorte que le premier coût d'exécution peut représenter une génération initiale des unités d'exécution.

Les threads seraient laissés dans le pool et réutilisés lors des exécutions suivantes. Statistiquement, vous voulez probablement générer des nombres plus grands pour mesurer les différences de performance - et vous ne pouvez pas créer une loi de Jefferson pour cela, car différentes charges de travail profitent plus ou moins de la parallélisation.

+2

bien que votre déclaration peut-être vrai, mais deux codes fournis par OP ne sont pas identiques. boucle parallèle peut rompre plus tôt avant d'itérer sur tous les index. –