2

まず、これをデュアルコア2.66Ghzプロセッサマシンで実行しています。.AsParallel()呼び出しが正しい場所にあるかどうかはわかりません。範囲変数でも直接試してみましたが、それでも遅くなりました。理由がわかりません...

これが私の結果です:

非並列1000の処理には146ミリ秒かかりました

プロセスパラレル1000は156ミリ秒かかりました

非並列5000の処理には5187ミリ秒かかりました

プロセス並列5000は5300ミリ秒かかりました

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;

namespace DemoConsoleApp
{
  internal class Program
  {
    private static void Main()
    {
      ReportOnTimedProcess(
        () => GetIntegerCombinations(),
        "non-parallel 1000");

      ReportOnTimedProcess(
        () => GetIntegerCombinations(runAsParallel: true),
        "parallel 1000");

      ReportOnTimedProcess(
        () => GetIntegerCombinations(5000),
        "non-parallel 5000");

      ReportOnTimedProcess(
        () => GetIntegerCombinations(5000, true),
        "parallel 5000");

      Console.Read();
    }

    private static List<Tuple<int, int>> GetIntegerCombinations(
      int iterationCount = 1000, bool runAsParallel = false)
    {
      IEnumerable<int> range = Enumerable.Range(1, iterationCount);

      IEnumerable<Tuple<int, int>> integerCombinations =
        from x in range
        from y in range
        select new Tuple<int, int>(x, y);

      return runAsParallel
               ? integerCombinations.AsParallel().ToList()
               : integerCombinations.ToList();
    }

    private static void ReportOnTimedProcess(
      Action process, string processName)
    {
      var stopwatch = new Stopwatch();
      stopwatch.Start();
      process();
      stopwatch.Stop();

      Console.WriteLine("Process {0} took {1} milliseconds",
                        processName, stopwatch.ElapsedMilliseconds);
    }
  }
}
4

2 に答える 2

4

PLINQには特定のオーバーヘッド(スレッド、スケジューリングなど)があるため、少し遅くなります。そのため、並列化するものを慎重に選択する必要があります。ベンチマークしているこの特定のコードは、実際には並列化する価値がありません。かなりの負荷がかかるタスクを並列化する必要があります。そうしないと、オーバーヘッドが並列化の利点よりも重要になります。

于 2010-04-10T23:44:38.573 に答える
0

ここでの実行時間の大部分は、ToList()メソッドを介して実際にリストを作成することに費やされる可能性があります。これには、いくつかのメモリ割り当て、リストのサイズ変更などを実行する必要があります。また、最終的な操作を同期する必要があるため(出力に単一のリストを作成しているため)、ここで並列化しても大きなメリットは得られません。

素因数分解など、並列セグメントでかなり複雑で高価なことを実行し、反復回数を数十万回に増やしてみてください(5000はプロファイリング時に使用する非常に小さな数です)。その時、違いがわかり始めるはずです。

また、リリースモードでプロファイリングしていることを確認してください。デバッグモードでプロファイリングを試みることがよくありますが、その結果は正確ではありません。

于 2010-04-10T23:50:53.813 に答える