锁定老帖子 主题:几行代码解决淘宝面试题 之Clojure版
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-15
最后修改:2010-07-15
写了那么长,我们这也是map/reduce
var collection = Enumerable.Range(0, 1000000).ToArray<int>(); long total = 0; Parallel.For<long>(0, collection.Length, () => 0, (j, loop, subtotal) => { subtotal += collection[j]; return subtotal; }, (x) => Interlocked.Add(ref total,x) ); 最简单的是:当然C#可以把所有魔术变成一行: collection.AsParallel<int>().Sum(); 比起楼主那些天书一样的语法,PLINQ简明到任何人一看就懂: 集合.并行处理.累加 上次还有人说,要处理大于10的,好吧,还是一行处理: collection.AsParallel<int>().Where(i=>i>10).Sum(); 集合.并行处理.取大于10的.累加。 至于什么partition之类的,本来就不需要程序员去介入,线程数应该等于CPU的core数目,手工去分partition,完全是浪费时间。 |
|
返回顶楼 | |
发表时间:2010-07-15
有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
|
|
返回顶楼 | |
发表时间:2010-07-15
hardPass 写道 我觉得关键是要掌握原理,
我相信,用java也可以做出类似的函数,然后一行代码调用即可 蛋疼 我期待你写出来看看。 |
|
返回顶楼 | |
发表时间:2010-07-15
最后修改:2010-07-15
dennis_zane 写道 有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft用同一套语法能做出: linq for parellel, linq for grid,LINQ-to-streaming computation , LINQ-to-GPU, 而程序员专注去处理自己的业务逻辑和并行算法。 对于大多数程序员来说,他们只是偶尔需要并行一下,比如正好处理一大段数据等等,这种简单的语法可以对付80%的场景,至于其他20%,.NET有自己专门的并行语言: AXUM,它的语法也远比clojure简单,而且组件可以和C#,F#交互。 |
|
返回顶楼 | |
发表时间:2010-07-15
dennis_zane 写道 有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
哥们听说你在淘宝分布式存储招人,假如我被你忽悠学了clojure,你会给我留个位置吗 |
|
返回顶楼 | |
发表时间:2010-07-15
ray_linn 写道 dennis_zane 写道 有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft把你看不起的糖衣,能包裹出linq for parellel, linq for grid,并加入对GPU的支持,而程序员专注于自己的处理逻辑本身。 您老很奇怪,又要跟我扯语言之争。我怎么会瞧不起语法糖衣,我对MS也没有任何意见。可能还是我说的不明白:我的本意是希望更多人关注clojure,通过这么个例子可以看出java和clojure之间巨大的生产力差距,看看clojure怎么将一个非并发的函数轻易地修改成并发执行。为了将问题说的清楚些,我不愿意将代码写的更进一步,不过我真不认为文中的代码是天书,从上到下看下来,解释得还算清楚吧。 |
|
返回顶楼 | |
发表时间:2010-07-15
kakaluyi 写道 dennis_zane 写道 有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
哥们听说你在淘宝分布式存储招人,假如我被你忽悠学了clojure,你会给我留个位置吗 哥,来我们部门不需要学clojure,您有兴趣就给我简历,多谢。 |
|
返回顶楼 | |
发表时间:2010-07-15
dennis_zane 写道 ray_linn 写道 dennis_zane 写道 有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft把你看不起的糖衣,能包裹出linq for parellel, linq for grid,并加入对GPU的支持,而程序员专注于自己的处理逻辑本身。 您老很奇怪,又要跟我扯语言之争。我怎么会瞧不起语法糖衣,我对MS也没有任何意见。可能还是我说的不明白:我的本意是希望更多人关注clojure,通过这么个例子可以看出java和clojure之间巨大的生产力差距,看看clojure怎么将一个非并发的函数轻易地修改成并发执行。为了将问题说的清楚些,我不愿意将代码写的更进一步,不过我真不认为文中的代码是天书,从上到下看下来,解释得还算清楚吧。 俺个人看法就是,不需要去关注边缘语言,如果C#能做出来的,Java同样也可以如此如此,而且在oralce的领导下,应该会进化得更快... |
|
返回顶楼 | |
发表时间:2010-07-15
ray_linn 写道 dennis_zane 写道 ray_linn 写道 dennis_zane 写道 有区别吗?没有区别,我当然也可以用一个宏将你口中“天书“的语法包装一下,给你一个很性感的语法糖衣,文中代码也可以精简成一行。不过这不是重点,我其实是想忽悠更多的java程序员去看看clojure。
当然有区别,本来并行的算法就已经很劳神了,在折腾那些有的没的天书似的的语法,就是浪费生命。Microsoft把你看不起的糖衣,能包裹出linq for parellel, linq for grid,并加入对GPU的支持,而程序员专注于自己的处理逻辑本身。 您老很奇怪,又要跟我扯语言之争。我怎么会瞧不起语法糖衣,我对MS也没有任何意见。可能还是我说的不明白:我的本意是希望更多人关注clojure,通过这么个例子可以看出java和clojure之间巨大的生产力差距,看看clojure怎么将一个非并发的函数轻易地修改成并发执行。为了将问题说的清楚些,我不愿意将代码写的更进一步,不过我真不认为文中的代码是天书,从上到下看下来,解释得还算清楚吧。 俺个人看法就是,不需要去关注边缘语言,如果C#能做出来的,Java同样也可以如此如此,而且在oralce的领导下,应该会进化得更快... clojure的语法是非常精简的,如果你去尝试了解下的话,它本身的实现也才几千行代码。我不大相信oracle能做出大的改变,c#有Anders Hejlsberg掌控,James Gosling刚从oracle离职没多久,从java7的闭包语法来看,基本是个悲剧。 |
|
返回顶楼 | |
发表时间:2010-07-15
dennis_zane 写道 clojure的语法是非常精简的,如果你去尝试了解下的话,它本身的实现也才几千行代码。我不大相信oracle能做出大的改变,c#有Anders Hejlsberg掌控,James Gosling刚从oracle离职没多久,从java7的闭包语法来看,基本是个悲剧。 Java的开发人员太老朽了一点,思路没有.NET团队宽阔。.NET从设计之出就有多种语言互相调用的考量: 主流OO: C# (VB.NET姑且写着 ) 函数式: F# 分布式: Axum 多范式(DSL): Nemerle Java的Scala, groovy都有点遮遮掩掩的。。。不爽不爽 |
|
返回顶楼 | |