首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何知道一组代码是否适合并行化?

问我如何知道一组代码是否适合并行化?
EN

Software Engineering用户
提问于 2018-01-04 18:07:17
回答 2查看 1.1K关注 0票数 7

在应用程序中,我如何判断是否有部分将受益于使用C#任务库(我认为这是并行处理库)。

考虑到已经完成了其他优化,除了尝试之外,我怎么知道呢?在C#中,我可以使用Visual进行此分析吗?

EN

回答 2

Software Engineering用户

发布于 2018-01-04 18:26:43

当代码被分解成一组“离散”(即独立的)任务时,代码是一个很好的并行化选择。离散的任务是产生特定结果的任务,没有与其他任务竞争的副作用,即一个独立的工作项目。

考虑一下这种并行递归快速排序算法:

代码语言:javascript
复制
private void QuicksortSequential<T>(T[] arr, int left, int right) 
where T : IComparable<T>
{
    if (right > left)
    {
        int pivot = Partition(arr, left, right);
        QuicksortSequential(arr, left, pivot - 1);
        QuicksortSequential(arr, pivot + 1, right);
    }
}

private void QuicksortParallelOptimised<T>(T[] arr, int left, int right) 
where T : IComparable<T>
{
    const int SEQUENTIAL_THRESHOLD = 2048;
    if (right > left)
    {
        if (right - left < SEQUENTIAL_THRESHOLD)
        {

            QuicksortSequential(arr, left, right);
        }
        else
        {
            int pivot = Partition(arr, left, right);
            Parallel.Do(
                () => QuicksortParallelOptimised(arr, left, pivot - 1),
                () => QuicksortParallelOptimised(arr, pivot + 1, right));
        }
    }
}

注意底部的Parallel.Do。这就是并行化发生的地方;它可以工作,因为对QuicksortParallelOptimised的所有调用都不会相互干扰。

要并行化您自己的代码,您应该重写它,使其可以表示为一系列独立的函数,每个函数都接受一些参数并返回一个Task<T>。然后,您可以并行运行这些函数,并在完成时组合结果。

进一步阅读

如何:编写一个简单的Parallel.ForEach循环

票数 10
EN

Software Engineering用户

发布于 2018-01-04 18:36:31

一个很好的指标是:如果您经常执行代码来执行某件事情(例如,对于文件夹中的每个文件),那么这种特定的执行是相互独立的。这是一个琐碎的部分,纯粹的“功能层”。

重要的部分是“设计层”:如果你想并行一些东西来加速,你应该分析你的程序:你的程序的哪些部分花的时间最多?也许你能找到比要求更频繁地执行的功能?然后,您可以重新设计您的应用程序。(设计一个旨在加快程序速度的程序可能会导致较低的可读性。在这里,你应该思考一下速度和可读性的价值,严希望能找到一个折衷方案。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/363442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档