是否有执行并行化的 R5RS 或更高版本的方案实现?例如,如果我说要做:
(map (lambda (x)
(pure-functional-stuff x))
'(1 3 5 7 11 13))
如果机器可以做到,它会同时处理1、3、5和7?这应该是函数式编程的一大优势,但我找不到一个维护的、最新的方案来做到这一点。除非我断言该函数没有副作用,否则我会使用不会并行化它的函数。
是否有执行并行化的 R5RS 或更高版本的方案实现?例如,如果我说要做:
(map (lambda (x)
(pure-functional-stuff x))
'(1 3 5 7 11 13))
如果机器可以做到,它会同时处理1、3、5和7?这应该是函数式编程的一大优势,但我找不到一个维护的、最新的方案来做到这一点。除非我断言该函数没有副作用,否则我会使用不会并行化它的函数。
我是 Schemik 的开发人员,我认为这是您正在寻找的方案。该项目仍在开发和维护中。今年年初,我发布了一个改进与 R5RS 兼容性的版本。不幸的是,Schemik 是一个专注于表达式评估过程的研究项目,因此其标准库仍然相对较小。您在 Schemik 中是否遗漏了任何特定功能?
事实证明,您并不真的希望编译器尝试并行化所有内容,因为即使执行简单的操作,您最终也会浪费时间协调工作,例如,
(map add1 '(1 2 3))
只在一个线程上做会更快。然而,当“add1”实际上是“真正的长计算”时,现在的许多函数式语言让你很容易实现这种并行。每种语言都有自己的方法,但我建议使用期货来利用 Racket 中的多个核心。
虽然编译器自动为您决定事情很好,但将“map”更改为“pmap”并不是一个糟糕的权衡,您认为它可能会有所帮助,而不是处理其他地方的减速,因为编译器过于雄心勃勃。
一些基本的东西
(define (pmap f xs)
(map touch (map (λ(x) (future (λ() (f x)))) xs)))
明智地使用可以让您走得很远,但是您应该尝试将数据分块以提供给并行线程。