微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

编程语言 – 为什么闭包突然对优化程序在多个内核上运行有用?

我读了一个 article,声称闭合(或“块”)是“多核战争”中的有用武器,因为

[…] they allow you to create units of
work,which each have their own copy
of the stack,and don’t step on each
others toes as a result. What’s more,
you can pass these units around like
they are values,when in actual fact
they contain a whole stack of values
(pun intended),and executable code to
perform some operation.

现在,我不是在讨论闭包的有用性,也可能是共享内存模型中的并发编程,但是与仅作用于本地数据(或进程,或者actor,或……)的线程的区别是什么? ?

作为没有调度程序的线程的并发编程,它本身不是一个闭包吗?

什么是关闭具有非局部副作用?

解决方法

争论的焦点是,在编程语言中使用闭包可以更容易地在另一个线程中完成一些工作.我认为作者应该在该论证中提到高阶函数的重要性.

我最喜欢的高阶函数的介绍是“Why functional programming matters”,我不会尝试在这里展示一个糟糕的复制品.

因此,如果你要在for循环中执行闭包,那么使用闭包不会免费提供并行性,例如

for (int i = 0; i < numElements; i++) {
  result[i] = closure(inputs[i],i);
}

因为语言无法判断闭包(a,b)是否以某种方式改变了结果或​​输入数组中的其他值.但是具有高阶函数(如map)的语言指定传递给map的函数不应查看或更改输入中的其他值,并防止它影响其他结果.因此,类似下面的代码(在函数式语言中很常见)可以为您并行化,而无需创建工作线程池并将闭包交给它们:

results = map(closure,inputs,[0..numElements-1]);

在这些语言中,闭包消除了在短片代码中声明新函数的痛苦.这使得使用高阶函数更有趣.

下面的Haskell代码定义了一个函数f,它接受一个数字列表并返回一个列表,其中每个输入i被替换为2i 1.通过保存创建函数来计算2i 1的麻烦这是1行代码而不是2行.

f nums = map (\i -> 2*i+1) nums

再次,请参阅“Why functional programming matters”以获得有关如何扩展到实际代码库的强有力论据.

原文地址:https://www.jb51.cc/java/120728.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐