Azul System的Cliff Click博士是多核心JVM系统方面的专家,之前发表了一篇博文,首先比较了Java与C语言和C++的性能表现,但同时也讨论了C#和.NET。以下三个Cliffs博士的评论让人十分感兴趣:
10年积累的网站设计、做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有汉寿免费网站建设让你可以放心的选择与我们合作。
在标题"Places where C/C++ beats Java for obvious reasons"下:
“值类型,例如复杂类型,在Java中需要一个类来支持”
"Value Types, such as a 'Complex' type require a full object in Java." - Dr Cliff Click
Cliff忘记提及的是.NET同样提供值对象和比复数更加引人注意的humble hash table。
考虑一下以10,000,000个整数/单精度浮点数 填充hash表,这个任务可以使用Java来完成,如下:
- package hashtablebenchmark;
- import java.util.HashMap;
- public class Main {
- public static void main(String[] args) {
- int n = 10000000;
- for (int j=0; j<10; ++j) {
- long startTime = System.currentTimeMillis();
- HashMap hashtable = new HashMap(n);
- for(int i=1; i<=n; ++i) {
- hashtable.put(i, 1.0f / i);
- }
- System.out.println("m[100] = " + hashtable.get(100));
- long time = System.currentTimeMillis() - startTime;
- System.out.println("Took: " + time / 1e3 + "s");
- }
- }
- }
同样的程序在F#中不仅仅代码更短并且速度要快上17倍:
- let n = 10000000
- let m = System.Collections.Generic.Dictionary(n)
- for i=1 to n do
- m.[i] <- 1.0f / float32 i
- printf "m[100] = %f\n" m.[100]
特别值得提及的是,Java初始化花费6.967s、稳态花费5.733s,而F#只用了0.414s。
实际上,F#通过这个测试后我们便想给它更大的工作量,而在这台4GB内存的机器上,Java不可能再做更多了。
在别处的评论,Cliff也这样写到Java:
“有非常好的多线程支持,并行程序设计在Java中很容易实现”
"Very Good Multi-Threading Support. Parallel programming is just easier in Java." - Dr Cliff Click
之后又有:
“并非我如此关注C#而是...我认为JIT编码处理基本上比Java要慢”
"Not that I track C# all that closely but... I believe the JIT produces substantially slower code than Java" - Dr Cliff Click
允许我们在其他方面来证明,Computer Language Shootout软包含了一个格式良好的spectral-norm测试,最快的Java解决方案是一个173行的并行程序。其实现用F#来写只需要24行代码:
- let A i j = 1.0 / float((i + j) * (i + j + 1) / 2 + i + 1)
- let inline mul A (u: _ []) (v: _ []) =
- System.Threading.Tasks.Parallel.For(0, v.Length, fun i ->
- let mutable vi = 0.0
- for j = 0 to v.Length - 1 do
- vi <- vi + A i j * u.[j]
- v.[i] <- vi) |> ignore
- let AtAu u v =
- let w = Array.create (Array.length u) 0.0
- mul (fun i j -> A i j) u w
- mul (fun i j -> A j i) w v
- do
- let n = 5500
- let u, v = Array.create n 1.0, Array.create n 0.0
- for i = 0 to 9 do
- AtAu u v
- AtAu v u
- let u, v = vector u, vector v
- printf "%0.9f\n" (sqrt(Vector.dot u v / Vector.dot v v))
在Java代码中,大量的代码都是用来实现并行化。与之相反的是,F#在处理并行化上只用了两行代码。可见,并行程序设计在Java中可不是那么easy。
Java串行程序初始花费了12.722s稳态花费12.299s,而冷启动的F#只用了12.18s。在8核 2xE5405 2.0GHz Xeon的机器上,Java并行程序初始化花费1.839s稳态花费1.820s,而冷启动的F#并行程序只用了1.60s。事实证明,Java在每一个测试中都表明CLR的JIT并不是“处理基本上比Java更慢”
***,Cliff并没有提到其他两个设计上(Java性能)的不足。首先,Java的泛型代码导致性能大幅下降,由于它使用了许多不必要的装箱操作。其次,JVM栈缺少尾部递归支持,这不仅仅对这个函数式编程的年代带来越来越多的障碍,而且唯一的一般解决方案也比需要的慢上10倍。
英文连接:http://fsharpnews.blogspot.com/2010/05/java-vs-f.html
名称栏目:Java与F#的并行程序处理对比
URL分享:http://www.mswzjz.cn/qtweb/news21/77721.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能