【发布时间】:2012-05-24 13:45:06
【问题描述】:
在包含Doubles 的集合(为简单起见,称它们为列表)的数据结构上考虑这个顺序过程。只要我愿意,就去做:
- 从结构中随机选择两个不同的列表
- 根据这些列表计算统计数据
- 根据该统计数据掷硬币
- 可能会根据掷硬币的结果修改其中一个列表
目标是最终实现收敛,因此“解决方案”在迭代次数上是线性的。这个过程的实现可以在 SO 问题here 中看到,这里有一个直观的可视化:
似乎可以更好地执行此过程 - 也就是说,可以更快地实现收敛 - 通过使用多个工作人员在不同的操作系统线程上同时执行,例如:
我想一个完美实现的实现应该能够在 O(n/P) 时间内实现解决方案,因为 P 可用计算资源的数量.
阅读 Haskell 并发让我头晕目眩,诸如 MVar、TVar、TChan、acid-state 等。似乎很清楚的是,这个过程的并发实现看起来与the one I linked above。但是,该过程本身似乎本质上是一个相当温和的算法,它本质上是一个内存数据库,我敢肯定有人以前遇到过这个问题。
我猜我将不得不使用某种可变的并发数据结构来支持体面的随机访问(即对 random 空闲元素)和修改。当我尝试将这可能需要的所有东西拼凑起来以提高性能时,我有点迷失了(例如,STM 似乎很可疑)。
如果目标是提高顺序实现的性能,哪些数据结构、并发概念等适合此类任务?
【问题讨论】:
-
我最终使用了
STM,它比MVars更不痛苦。一些代码的快照在这里:hpaste.org/69045。除非我使用非常(不必要)大量的迭代,否则它不会胜过我的顺序实现,但我对它的实现如此容易感到震惊。
标签: haskell random concurrency simulation