2

PLINQ を使用して単純なシミュレーションを高速化しようとしていますが、代わりに速度を落としています (コメントを外した AsParallel の実行速度は遅くなります)。

class Program
{
    private static readonly Random Random = new Random();

    private static IEnumerable<Tuple<double, double>> GetNextPair(int pairs)
    {
        for (int i = 0; i < pairs; i++)
            yield return new Tuple<double, double>(Random.NextDouble(), Random.NextDouble());
    }

    private static double RunSimPlinq(int count)
    {
        return
            GetNextPair(count)
                //.ToArray()
                //.AsParallel()
                .Count(tuple =>
                    {
                        //Thread.Sleep(10);
                        return tuple.Item1*tuple.Item1 + tuple.Item2*tuple.Item2 <= 1d;
                    })*4d/count;
    }

    static void Main()
    {
        Stopwatch sw = new Stopwatch();
        sw.Start();
        Console.WriteLine(RunSimPlinq(100));
        sw.Stop();
        Console.WriteLine(sw.ElapsedMilliseconds);
        Console.Read();
    }
}

理由についての私の唯一の推測は、ランドの列挙可能 (または逆に、そのコピー) に関する競合です。

PS。出力は PI の推定値である必要があります。

4

1 に答える 1