Parallel processing 并行执行多少任务
我构建了一个示例程序来检查并行任务的性能,以及并行运行的任务数量 一些假设: 操作是在独立于另一个线程的线程上进行的,所以线程之间不需要同步机制 其目的是检查以下各项是否有效: 1.产生尽可能多的任务 或 2.限制并行任务的数量,并在生成剩余任务之前等待某些任务完成 节目如下: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("
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
调用,然后重试-它们可能会产生很大的影响。)