2012-05-02 27 views
5

Ho imparato un po 'di parallelismo negli ultimi giorni e ho trovato l'esempio this.Perché la versione parallela è stata più lenta della versione sequenziale in questo esempio?

lo metto un lato all'altro con un sequenziale per ciclo come questo:

private static void NoParallelTest() 
{ 
    int[] nums = Enumerable.Range(0, 1000000).ToArray(); 
    long total = 0; 
    var watch = Stopwatch.StartNew(); 
    for (int i = 0; i < nums.Length; i++) 
    { 
     total += nums[i]; 
    } 
    Console.WriteLine("NoParallel"); 
    Console.WriteLine(watch.ElapsedMilliseconds); 
    Console.WriteLine("The total is {0}", total); 
} 

Sono stato sorpreso di vedere che il metodo NOPARALLEL finito modo modo più veloce rispetto all'esempio parallelo data sul sito.

Ho un PC i5.

Ho davvero pensato che il metodo Parallelo sarebbe finito più velocemente.

Esiste una spiegazione ragionevole per questo? Forse ho frainteso qualcosa?

+1

Può confermare che la versione parallela in realtà riceve più core? E cosa succede quando aumenti il ​​numero di iterazioni (più grande 'Range')? – chrisaycock

+6

Supponendo che la versione parallela sia stata eseguita su più core, può semplicemente mostrare quanta sincronizzazione di thread overhead può avere ... specialmente in una piccola parte di codice. – Oded

+0

Per parafrasare Mark Twain; * "Ci sono bugie, maledette bugie, statistiche e benchmark ..." * –

risposta

10

La versione sequenziale era più veloce perché il tempo impiegato per eseguire le operazioni su ogni iterazione nell'esempio è molto piccolo e vi è un overhead abbastanza significativo relativo alla creazione e alla gestione di più thread.

La programmazione parallela aumenta solo l'efficienza quando ogni iterazione è sufficientemente costosa in termini di tempo del processore.

2

Penso che sia perché il ciclo esegue un'operazione molto semplice, molto veloce.

Nel caso della versione non parallela è tutto ciò che fa. Ma la versione parallela deve invocare un delegato. Invocare un delegato è abbastanza veloce e di solito non devi preoccuparti di quanto spesso lo fai. Ma in questo caso estremo, è ciò che fa la differenza. Posso facilmente immaginare che invocare un delegato sarà, diciamo, dieci volte più lento (o più, non ho idea di quale sia l'esatto rapporto) rispetto all'aggiunta di un numero da un array.

2

Non si confrontano le mele con le arance.

L'esempio si collega a non riguarda il parallelismo o concorrenza tanto quanto si tratta di disconnessione stato venga condiviso amoung i diversi thread. Il lavoro sta facendo è un uomo di paglia per mostrare solo che qualcosa è stato fatto.

Quindi quello che stai confrontando è come paragonare un'auto di F1 a un Top Fuel Dragster. Ogni Excel in corso veloce, ma veloce è relativo al contesto che in questo e nella maggior parte dei casi è altamente specializzato. Nessuno dei due può competere negli altri bailiwick altamente specializzati.

lezioni da imparare

  • concorrente! = Più veloci
  • benchmark mal concepiti indurre in errore
Problemi correlati