![]() |
1
1
相对快速和肮脏的解决方案是使用 a load-balancing partitioner 在按大小递减排序的操作列表顶部
仅使用这两条线,表演者就可以提高大约30%,就像其他答案一样。 plinq对数据进行分区,并使用单独的任务一次处理整个分区。当输入大小已知时,就像IList派生的数组和列表一样,输入被划分成大小相等的块,并送入每个工作任务。 当大小未知时,例如迭代器方法、LINQ查询等,PLINQ使用块分区。一次检索一大块数据并将其发送给工作任务。 另一个我忘记了的选择是 负载均衡 在上面的块分区。这将使用小块对数组和ilist派生的输入应用块分区。负载平衡 Partitioner.Create 重载返回OrderablePartitioner实例,因此保留了IAction项的顺序
同样可以通过
这将创建一个使用区块编码的OrderablePartitioner |
![]() |
2
1
我马上就说,问题如下。 你有一个整数列表和有限数量的夏天。 您需要一个将整数求和到Summers中的算法,以便Summers的最大值是可能的最小值。 例如。:
如您所见,边界因子是运行时间最长的任务。较短的容易同时送达或在较短的时间内送达。它类似于背包,但归根结底归结为一个非常简单的“最长优先”的任务顺序。 伪代码(与我的 发明 类)将是:
这只是伪代码,不是并行/异步和块。我希望你能从中得到一些有用的东西。 |
![]() |
3
1
嗯,要看情况。在我的硬件上,如果我简单地将循环更改为首先运行所有长任务,那么您的人为示例(修改后的睡眠时间为1000100和10毫秒,因为我没有一整天的睡眠时间)将快30%(~15秒对~22秒):
但这当然取决于 完全地 这些任务的负载是多少。如果两个不同的任务大量使用同一个资源(例如共享数据库),那么并行运行这两个任务可能会获得非常有限的收益,因为它们最终只会在某个级别上锁定彼此。 我建议您需要更深入的分析,然后以某种方式根据任务的“可并行性”对它们进行分组,并尽量确保您使用尽可能多的“兼容”任务运行尽可能多的并行线程…当然,如果一个特定的任务似乎总是花费所有其他任务的时间,那么确保首先开始一个任务…… 很难用这里给出的细节给出更好的建议。 |
![]() |
4
1
按任务大小按降序排序,然后使用taskfactory在不同的任务中执行每个任务,从而节省了大量的运行时间。平行度水平保持在20。 结果是:原始样本中有114676ms对193713ms。(约40%改善) 编辑:在您的特定示例中,列表仍然是从get go排序的,但是parallel.foreach不保留输入顺序。
|
![]() |
drainzerrr · Go锁定结构的一部分 6 年前 |
![]() |
Azim · 使用java 8并行处理图像 6 年前 |
|
user8005765 · Karatsuba-多项式与CUDA相乘 6 年前 |
![]() |
Adi · 并行读取大型XSLT字符串 6 年前 |
![]() |
A.J · 同时运行两个python文件 6 年前 |
![]() |
Kristofer · 当索引设置为私有时,如何确保访问缓冲区是私有的 6 年前 |