【发布时间】:2011-08-05 15:09:34
【问题描述】:
如果使用 Haskell 作为 库 被 我的 C 程序调用,那么调用它会对性能产生什么影响?例如,如果我有一个包含 20kB 数据的问题世界数据集,并且我想运行类似:
// Go through my 1000 actors and have them make a decision based on
// HaskellCode() function, which is compiled Haskell I'm accessing through
// the FFI. As an argument, send in the SAME 20kB of data to EACH of these
// function calls, and some actor specific data
// The 20kB constant data defines the environment and the actor specific
// data could be their personality or state
for(i = 0; i < 1000; i++)
actor[i].decision = HaskellCode(20kB of data here, actor[i].personality);
这里会发生什么 - 我是否可以将 20kB 的数据作为全局不可变引用保存在 Haskell 代码可以访问的某个地方,或者我必须每次都创建该数据的副本?
令人担忧的是,这些数据可能会越来越大 - 我还希望编写能够作用于更大数据集的算法,使用与 Haskell 代码的多次调用相同的不可变数据模式。
另外,我想将其并行化,例如 dispatch_apply() GCD 或 Parallel.ForEach(..) C#。我在 Haskell 之外进行并行化的理由是,我知道我将始终对许多单独的函数调用(即 1000 个参与者)进行操作,因此在 Haskell 函数中使用细粒度并行化并不比在 C 级别管理它好。正在运行 FFI Haskell 实例“线程安全”,我如何实现这一点 - 每次启动并行运行时是否需要初始化 Haskell 实例? (如果必须的话,似乎很慢..)如何以良好的性能实现这一目标?
【问题讨论】:
-
helper data pList = map (f data) pList或类似的可能吗? -
@Dan,我真的不知道。也许您可以通过答案详细说明-谢谢
标签: performance haskell parallel-processing ffi