任务并行性比正常执行慢?

ahi*_*kaz 0 .net c# task c#-4.0

我有点困惑,因为当我使用这段代码时:

catalog.Elements = GetElements(myProvider.Elements);
catalog.Programs = GetPrograms(myProvider.Programs);
catalog.Details = GetDetails(myProvider.Details);
Run Code Online (Sandbox Code Playgroud)

我有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;
Run Code Online (Sandbox Code Playgroud)

我得到6秒.

当我不使用任务并行性时,它是否更快是正常的?

谢谢

Ada*_*rth 6

并行性有多种形式.它完全取决于底层硬件和您尝试"并行化"的问题.

在您的情况下,您可能会在CPU级别获得资源争用.多少个核心?共享缓存?计算上昂贵的例程?非常轻的例程,因此线程的开销超过了收益?例程是否访问共享状态?

很多问题.基本上,不要假设并行代码运行得更快.

对不起,这不是您的性能问题的答案,但要做到这一点,您需要解释每个例程正在做什么.

从好的方面来说,我会乐观地假设你做了好事并描述了两段代码.你的分析告诉你"并行化"(注意,而不是瘫痪:-P)代码没有任何好处,所以可以避免使用更简单的同步代码.

实际上,回答你的问题:是的,这可能是正常的,但需要了解你试图并行化的问题.不要将这个例子作为TPL预期的性能指标.当谈到我用异步代码制作的错误或假设时,我总是吃着不起眼的馅饼......