Parallel processing 并行执行多少任务

Parallel processing 并行执行多少任务,parallel-processing,task-parallel-library,Parallel Processing,Task Parallel Library,我构建了一个示例程序来检查并行任务的性能,以及并行运行的任务数量 一些假设: 操作是在独立于另一个线程的线程上进行的,所以线程之间不需要同步机制 其目的是检查以下各项是否有效: 1.产生尽可能多的任务 或 2.限制并行任务的数量,并在生成剩余任务之前等待某些任务完成 节目如下: static void Main(string[] args) { System.IO.StreamWriter writer = new System.IO.StreamWriter("

我构建了一个示例程序来检查并行任务的性能,以及并行运行的任务数量

一些假设: 操作是在独立于另一个线程的线程上进行的,所以线程之间不需要同步机制

其目的是检查以下各项是否有效: 1.产生尽可能多的任务 或 2.限制并行任务的数量,并在生成剩余任务之前等待某些任务完成

节目如下:

    static void Main(string[] args)
    {
        System.IO.StreamWriter writer = new System.IO.StreamWriter("C:\\TimeLogV2.csv");

        SemaphoreSlim availableSlots;


        for (int slots = 10; slots <= 20000; slots += 10)
        {
            availableSlots = new SemaphoreSlim(slots, slots);
            int maxTasks;
            CountdownEvent countDownEvent;
            Stopwatch watch = new Stopwatch();
            watch.Start();

            maxTasks = 20000;
            countDownEvent = new CountdownEvent(maxTasks);

            for (int i = 0; i < maxTasks; i++)
            {
                Console.WriteLine(i);
                Task task = new Task(() => Thread.Sleep(50));
                task.ContinueWith((t) =>
                {

                    availableSlots.Release();
                    countDownEvent.Signal();
                }
                );

                availableSlots.Wait();
                task.Start();
            }
            countDownEvent.Wait();

            watch.Stop();
            writer.WriteLine("{0},{1}", slots, watch.ElapsedMilliseconds);
            Console.WriteLine("{0}:{1}", slots, watch.ElapsedMilliseconds);
        }

        writer.Flush();
        writer.Close();
    }
static void Main(字符串[]args)
{
System.IO.StreamWriter writer=新的System.IO.StreamWriter(“C:\\TimeLogV2.csv”);
信号量lim可用性地段;
对于(int slots=10;slots Thread.Sleep(50));
任务。继续((t)=>
{
availableSlots.Release();
倒计时事件。信号();
}
);
availableSlots.Wait();
task.Start();
}
countDownEvent.Wait();
看,停;
writer.WriteLine(“{0},{1}”,插槽,watch.elapsedmillesons);
Console.WriteLine(“{0}:{1}”,插槽,watch.elapsedmillesons);
}
writer.Flush();
writer.Close();
}
结果如下:

Y轴是以毫秒为单位的时间,X轴是信号灯插槽的数量(请参阅上述程序)

基本趋势是:并行任务的数量越多越好。现在我的问题是,在什么条件下:

并行任务数量越多=优化程度越低(所用时间)

我想有一个条件是: 这些任务是相互依赖的,可能需要等待某些资源可用


在任何情况下,您是否限制了并行任务的数量?

TPL将控制一次运行的线程数-基本上,您只是在排队等待在这些线程上运行的任务。您并不是在并行运行所有这些任务

TPL将使用偷工队列,以尽可能提高效率。如果您拥有关于需要运行哪些任务的所有信息,那么您不妨将它们全部排队,而不是自己尝试进行微管理。当然,这将占用内存——因此,如果您有大量任务,这可能是一个问题

然而,我不会为了得到更多的任务而人为地将逻辑任务分解成小块。您不应该将“更多任务==更好”视为一般规则

(顺便说一句,我注意到您在测量中包括了向控制台写入大量行所需的时间。我会删除那些
console.WriteLine
调用,然后重试-它们可能会产生很大的影响。)