【发布时间】:2011-07-12 10:11:20
【问题描述】:
我有一个长时间运行的进程,它是forkIO'd,它产生像素颜色值:
takesAgesToRun :: [[Color]]
myForkedProcess :: IORef [[Color]] -> IO ()
myForkedProcess ref = do let colors = takesAgesToRun
writeIORef ref colors
(其中Color 仅包含三个Double 值)。
正如预期的那样,当在IORef 的“另一边”读取时,存储的值只是一个 thunk,因此阻塞了主进程。
我知道我需要全面评估 [[Color]] 值以引导范式,但似乎有两种方法可以实现这一点,此外,我不确定如何将其中任何一种合并到我的代码中。
我该怎么做?我是使用rnf、deepSeq 还是其他一些线程策略? 是首选其中之一,而其他则弃用了吗?它如何适合我的代码?
(PS 请忽略将图像存储为颜色列表的事实是愚蠢的 - 这只是代码的简化版本)。
【问题讨论】:
-
请注意,如果您使用 [[Color]] 来呈现像素,那么无论您将其并行化多少,您的程序的性能都可能很糟糕。
-
@tibbe - 是的,同意。我对 Haskell 非常陌生,所以除了让程序真正运行之外,我的下一个目标是保持应用程序的 UI 响应。稍后我会将位图存储移动到
UArray或类似位置 - 但无论如何我仍然需要此功能。 -
还要考虑向量库中未装箱的向量。我一直在搞乱这些,它们似乎设计得更好,性能也更好;)
-
@stusmith - 尽管您的决定背后的原则是明智的,但我建议您尽早转向替代存储实现。由于列表与数组和向量具有不同的结构,因此您将无法准确衡量您的算法。您将编写旨在使用数组并在列表中获得可怕性能的算法,或者您将编写针对在其他结构上具有次优结果的列表进行调整的算法。如果您使用兼容的存储,它还将简化与其他库的接口。
-
@monadic:我从未见过未装箱的向量比数组有更好的性能,你能在某处发布一个例子吗?我不认为有任何问题,界面更丰富。
标签: multithreading haskell ioref