任务并行性比正常执行慢

本文关键字:执行 常执行 并行性 任务 | 更新日期: 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方法,而不是通过盲目创建新任务来在两个核心上堆叠线程,因为它已经进行了一些性能调整,如线程回收和负载平衡。