2016-11-01 1 views
-3

私は実際のコンピューティングタスクに似た偽のテストを行いました。私の現在のコードは次のとおりです。C#1つの長いコンピューティングプロセスを並列化する最適な方法は何ですか?

static void Main() 
{ 
    List<ulong> list = new List<ulong>(); 
    Action action =() => 
    { 
     Random rng = new Random(Guid.NewGuid().GetHashCode()); 
     ulong i = 0; 
     do 
     { 
      i++; 
      if (rng.Next(100000000) == 1000) 
      { 
       lock (list) list.Add(i); 
       Console.WriteLine("ThreadId {0}, step {1}: match is found", 
            Thread.CurrentThread.ManagedThreadId, i); 
      } 
     } while (list.Count < 100); 
    }; 
    int length = Environment.ProcessorCount; 
    Action[] actions = new Action[length]; 
    for (int i = 0; i < length; i++) 
     actions[i] = action; 
    Parallel.Invoke(actions); 

    Console.WriteLine("The process is completed. {0} matches are found. Press any key...", 
         list.Count); 
    Console.ReadKey(); 
} 

は一つの長い計算処理のための並列タスクの数を最適化するために任意のより良い方法はありますか?

+0

子孫に不安な 'List'を' lock'するのではなく 'ConcurrentBag'のようなTPLコレクションをチェックアウトする必要があります – MickyD

+0

@MickyD。 [こちら](http://stackoverflow.com/a/29307598/6123485)を見て、自分で試してみてください。やった。 – quicktrick

+0

OPにdownvotingする人に。あなたがそのような場合のよりよいアプローチを知っているなら、downvotingの代わりにあなたの答えを与えてください。私はこの質問をする前にインターネットを非常に長い間探してきました。私はまだそのようなタスクのためのより良い解決策を見つけていない。 – quicktrick

答えて

2

質問が正しく理解されているかわかりません。共有したコードは、アクションの異なるインスタンスを並行して実行します。しかし、パフォーマンスのために長時間実行しているタスクを並列で実行する場合は、長時間実行しているタスクを小さなワークグループに分割する必要があります。または、コレクションを反復処理する場合、TPLによって提供されるParallel forまたはforeachを使用できます)コアの数やCPUなどの負荷のようなメトリックに応じてスレッドの数を決定します。

+1

申し訳ありません@教えて、私は小さなグループに私の仕事を分けることはできません。それは私が上で与えたものとほとんど同じです。これは、最良のマッチを見つけるための長い遺伝的アルゴリズムです。私はコレクションの並列反復について知っていますが、それは合計で私のアルゴリズムのパフォーマンスを低下させ、大幅にリソースの消費を増加させます。私はすでにそのアプローチを試みました。これは私の現在のテストに基づいて、より良いです。 – quicktrick

+0

したがって、同じアルゴリズムを同時に異なる開始点で実行することで、より早く一致を見つける確率が高まります。それが事実なら、私はあなたがあなたのアプローチに合っていると思っており、TPLは何の役にも立たないでしょう。 – Mertus

関連する問題