任务并行性比正常执行慢
本文关键字:执行 常执行 并行性 任务 | 更新日期: 2023-09-27 18:20:36
我有点困惑,因为当我使用以下代码时:
catalog.Elements = GetElements(myProvider.Elements);
catalog.Programs = GetPrograms(myProvider.Programs);
catalog.Details = GetDetails(myProvider.Details);
我有4秒钟的时间。
当我尝试使用任务(.NET 4.0)时:
Task<List<Element>> elementsTask = Task.Factory.StartNew<List<Element>>(
delegate {
return GetElements(myProvider.Elements);
});
Task<List<Program>> programsTask = Task.Factory.StartNew<List<Program>>(
delegate {
return GetPrograms(myProvider.Programs);
});
Task<List<Detail>> detailsTask = Task.Factory.StartNew<List<Detail>>(
delegate {
return GetDetails(myProvider.Details);
});
catalog.Elements = elementsTask.Result;
catalog.Programs = programsTask.Result;
catalog.Details = detailsTask.Result;
我还有6秒。
当我不使用任务并行性时,它会更快,这正常吗?
感谢
并行有多种形式。这完全取决于底层硬件和您试图"并行化"的问题。
在您的情况下,您可能会在CPU级别发生资源争用。有多少核心?共享缓存?计算成本高昂的程序?非常轻的例程,所以线程的开销大于收益?例程是否访问共享状态?
很多问题。基本上,不要认为并行代码运行得更快。
很抱歉,这并不能解决你的性能问题,但要做到这一点,你需要解释每个例程都在做什么
从好的方面来说,我会乐观地假设您已经做了好事,并对这两段代码进行了分析。您的评测告诉您,代码的"并行化"(注意,不是瘫痪:-P)不会带来任何好处,因此可以避免使用更简单的同步代码。
实际上 ,要回答您的问题:是的,这可能很正常,但需要理解您试图并行的问题。不要把这一个例子作为预期TPL表现的指标。当涉及到异步代码的错误或假设时,我总是谦虚地吃馅饼。。。
您应该使用ThreadPool.QueueUserWorkItem
方法,而不是通过盲目创建新任务来在两个核心上堆叠线程,因为它已经进行了一些性能调整,如线程回收和负载平衡。