MaxDegreeOfParallelism = Environnement.ProcessorCount ralentit le temps d'exécution sur mon CPU

J'ai le programme suivant (que j'ai reçu de http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx) qui divise la tâche à l'aide de Parallèle.Pour boucle

class Program
{
    static void Main(string[] args)
    {
        var watch = Stopwatch.StartNew();


        Parallel.For(2, 20, (i) =>
        {
            var result = SumRootN(i);
            Console.WriteLine("root {0} : {1} ", i, result);
        });

        Console.WriteLine(watch.ElapsedMilliseconds);
        Console.ReadLine();
    }

    public static double SumRootN(int root)
    {
        double result = 0;
        for (int i = 1; i < 10000000; i++)
        {
            result += Math.Exp(Math.Log(i) / root);
        }
        return result;
    }
}

Lorsque j'exécute ce test plusieurs fois que je reçois des fois:

1992, 2140, 1783, 1863 ms etc etc.

Ma première question est, pourquoi les horaires sont toujours différents?? Je suis en train de faire exactement les mêmes calculs à chaque fois pourtant, les temps varient à chaque fois.

Maintenant, quand je ajouter le code suivant à faire usage de tous les processeurs disponibles sur mon CPU:

        var parallelOptions = new ParallelOptions
        {
            MaxDegreeOfParallelism = Environment.ProcessorCount    (On my CPU this is 8)
        };

        Parallel.For(2, 20, parallelOptions, (i) =>
        {
            var result = SumRootN(i);
            Console.WriteLine("root {0} : {1} ", i, result);
        });

Je remarque que le temps d'exécution augmente effectivement!! Les temps sont maintenant:

2192, 3192, 2603, 2245 ms etc etc.

Pourquoi cette cause à la fois d'augmenter? Suis-je à l'aide de ce mal?

Quoi d'autre est en cours d'exécution sur votre système lorsque vous exécutez les tests? Êtes-vous de la compilation en mode Release? Est un débogueur? Est un profileur attaché?
Pour obtenir vraiment des résultats comparables, d'éviter les sorties de la console à partir de ces fils.
J'ai Outlook ouvert, ouvrir EverNote et google Chrome le navigateur web.
Son en mode Release et pas de débogueur ou quoi que ce soit est attaché.
Je pense que c'est le Casier principe au travail. Vous demandez à 8 threads pour faire 18 emplois, les 2 derniers emplois de prendre autant de temps que de 8 emplois. Lorsque vous retirez la limite, le TP planificateur permet plus de 8 threads pour commencer, car ils prennent trop de temps. Qui va ralentir à chaque travail, mais peut se débarrasser de la dernière 2.

OriginalL'auteur Harry Boy | 2013-12-27