在应用程序中,我如何判断是否有部分将受益于使用C#任务库(我认为这是并行处理库)。
考虑到已经完成了其他优化,除了尝试之外,我怎么知道呢?在C#中,我可以使用Visual进行此分析吗?
发布于 2018-01-04 18:26:43
当代码被分解成一组“离散”(即独立的)任务时,代码是一个很好的并行化选择。离散的任务是产生特定结果的任务,没有与其他任务竞争的副作用,即一个独立的工作项目。
考虑一下这种并行递归快速排序算法:
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>。然后,您可以并行运行这些函数,并在完成时组合结果。
进一步阅读
发布于 2018-01-04 18:36:31
一个很好的指标是:如果您经常执行代码来执行某件事情(例如,对于文件夹中的每个文件),那么这种特定的执行是相互独立的。这是一个琐碎的部分,纯粹的“功能层”。
重要的部分是“设计层”:如果你想并行一些东西来加速,你应该分析你的程序:你的程序的哪些部分花的时间最多?也许你能找到比要求更频繁地执行的功能?然后,您可以重新设计您的应用程序。(设计一个旨在加快程序速度的程序可能会导致较低的可读性。在这里,你应该思考一下速度和可读性的价值,严希望能找到一个折衷方案。
https://softwareengineering.stackexchange.com/questions/363442
复制相似问题