AMD 双核 2.8G ,4G内存 winxp

java+concjava+AKKA1.3java+AKKA2.0Scala+AKKA1.3Scala+AKKA2.0Go+goroutine

1-N

单位:秒

10000000.641.140.631.050.650.617

20000001.712.081.582.051.681.63

30000003.053.282.793.32.962.91

50000006.326.185.756.3676.16.04

10000000       17.1415.8515.816.516.616.35

12000000        22.420.48          20.221.3221.4821.3

(由于AMD硬件平台性能很烂,测试时间较长,所以只测试到12000000)

INETL 平台 酷睿双核2.4G ,4G内存 winxp

java+concurrentjava+AKKA1.3java+AKKA2.0Scala+ AKKA1.3Scala+ AKKA2.0Go+goroutine

1-N单位:秒

10000000.2090.870.2350.730.2190.28

20000000.531.120.480.980.4850.54

50000001.932.191.552.081.611.65

100000004.934.624.094.574.14.18

2000000013.2511.1410.9511.1310.9210.98

3000000023.2419.3719.1319.2519.3519.39

测试真是又费时间又枯燥的事情。在两个硬件平台测试了之后,还有一个苹果系统的没有时间进行测试,先放着,等以后再补上吧。

性能测试结果说明:

1、为了公平起见,各个组合的算法都是采用给多线程传递不变的参数,避免使用同步锁,尽量减少因为实现语言的不同而影响性能的因素。

2、性能表现最好的前3个分别是:java+AKKA2.0,Scala+AKKA2.0,Go+goroutine。这3个组合的多线程并发计算指标比较接近。尽管在测试前,对Go语言报了很大期望,以为Go会是测试的冠军,但事实证明,对这个CPU密集运算的多线程并发测试案例来说,Go并不占优势,甚至不如java+AKKA2.0组合。这也证明了AKKA这个高性能并发运算框架果然很优异。不了解AKKA2.0的朋友,请访问:http://www.gtan.com/akka_doc/index.html。

3、性能表现最常的是java+concurrent。当计算量小的时候,例如,1000000以下的时候,java+concurrent表现还不错。但计算量不断增大的时候,java+concurrent开始表现糟糕。在10000000以上的时候,java+concurrent表现更加糟糕。表现糟糕的原因可能是因为用到了 concurrent

的ExecutorService和Future。 Future其实是一种阻塞线程模式,所以性能并不是最佳。有时间读读AKKA2.0的源代码,也许能找到一些改进性能的参考办法。

4、性能表现一般的是java+AKKA1.3和Scala+AKKA1.3。它们和AKKA2.0版本的最大差异是,它们采用的是发送并等待返回消息的阻塞模式,而AKKA2.0版本则采用发送就不管了的无阻塞模式。事实证明,阻塞模式比无阻塞模式性能要差不少。此外,尽管AKKA1.3的阻塞模式性能不好,但在大计算量的情况下表现仍然不错,和Go语言差不多,比java+concurrent要好。

5、在运行java程序的时候,都加上了-server参数。而对于Scala和Go,我不了解该怎么优化,所以都只是使用Scala和Go普通的运行命令来启动程序。例如,

java -server org.aos.concurrent.samples.ConcurrentPrimeFinder 1000000 10 100

scala com.agiledeveloper.pcj.Primes 1000000 100

test_prime.exe -n=1000000 -workers=100

编程的难易程度测试结果说明:

1、由于本人有多年的JAVA编程经验,所以java+concurrent组合是编码花费时间最少的。

2、对于Scala和Go语言,本人学习的时间都差不多,3个星期左右。由于Scala和JAVA平台的互通性,也由于Scala平台的成熟和易用(开发工具和语法比Go好不少),所以开发Scala版本比Go版本所花费的时间要少。

3、Scala+AKKA1.3比Scala+AKKA2.0版本更容易开发。因为Scala+AKKA1.3的阻塞模式容易理解,代码量也少。但阻塞模式在计算量比较大的时候,容易报timeout异常。需要增加一个akka.conf文件来定义更长的阻塞等待时间。对于Scala+AKKA2.0,AKKA官方提供了一个无阻塞模式的参考例子,采用master+worker+listener对象组合。Master分发多份工作给多个worker去计算,

worker计算完后,分别把各自计算结果发回给master来汇总,最终,master把汇总结果发送给listener,并输出结果。为了使用这种对象组合,导致Scala+AKKA2.0版本的编码要比Scala+AKKA1.3版本复杂,花费的时间也相应要多些。另外,由于AKKA2.0采用无阻塞的模式,所以测试中没有出现过由于计算量大而出现的timeout问题。

4、从Scala转到Java版本,确实有些困难,但幸好两个平台是互通的,并且有参考的例子,所以转过来也不是太困难。和Scala版本一样的,java+AKKA1.3版本比java+AKKA2.0版本要容易写些,也存在着阻塞模式的timeout问题。

5、Go语言版本,由于和Java平台不互通,而且差异极大,编码花费时间最多。Go语言从Scala和Python等语言里获取了许多有益的东西,语法比较简洁,编译速度快,占用内存少,而且以goroutine的方式很方便地写出支持多线程并发计算的程序,确实很有发展前景。(在用过Scala和Go语言之后,真的很讨厌JAVA里面冗长的代码,特别是该死的分号‘;’)

但Go语言的缺陷也挺多的。这里就列几个测试所发现的情况:1)语言比较新,懂的人不多。这意味着学习成本和用人成本比较高;2)开发平台不成熟,在windows下安装配置Go的开发环境,本人的经历很痛苦。有一种当年用EditPlus写JAVA代码的感觉,很不爽。3)强类型转换,很烦人。为了使用math.Sqrt,居然逼我写了一段从float64转int的代码。在Java和Scala从未出现这样的情况。算是明白了,Go所谓的编译快其实就是程序员自己多付出点代价来照看代码。4)goroutine容易出现deadlock死锁现象。死锁的原因很多,让初学者头痛。

测试的最终结论:

综合性能测试和编码难易程度测试结果,本人从做项目的角度得出几点结论:

1、对于Java程序员,如果没有强制性的必要,不需要转到Scala和Go语言,因为Java+AKKA2.0足够好用了,足以应付多线程高并发应用。

2、对于Java程序员,如果程序应用于一般的多线程应用,并且性能要求不高,java的concurrent包也够用了。

3、对于Java程序员,如果想让项目的代码量减少一半,学习成本不太高,性能也有保障的话,Scala语言是非常好的选择。

4、对于Java程序员,如果项目时间有限,想要用Go语言来实现项目,那基本死路一条。

5、对于Go语言的未来,也许如Go编程语言QQ群里的朋友所说的那样,在云计算领域可能会大放光彩。

由于能力、精力和资源有限,这次比较测试并不完美,可能存在不少问题。欢迎有兴趣的朋友讨论并发表意见。

有疑问加站长微信联系(非本文作者)

Scala go java_Java、Scala和Go语言多线程并发对比测试结果和结论相关推荐

  1. Java、Scala和Go语言多线程并发对比测试

    2019独角兽企业重金招聘Python工程师标准>>> 本文试图记录下对流行的Java.Scala和Go语言多线程并发对比测试,作为未来项目选择开发语言的一个参考. 具体的语言对比测 ...

  2. 易语言 mysql支持库支持多线程_易语言多线程查询数据库 易语言多线程并发

    为什么易语言两个线程同时对一个MYSQL数据? 数据库有自己的连接锁机制,如果是针对同一台机器使用同一个接口进行插入的话多线程和单线程是一样的.除非你有好几台数据库服务器,这样再使用多线程来进行上面的 ...

  3. Scala具体解释---------Scala是什么?可伸展的语言!

    Scala是什么 Scala语言的名称来自于"可伸展的语言". 之所以这样命名,是由于他被设计成随着使用者的需求而成长.你能够把Scala应用在非常大范围的编程任务上.从写个小脚本 ...

  4. 熟悉scala命令,scala语言运行超级素数和猴子大王

    实验目的 在Linux操作系统中安装Scala 输入"scala"命令,熟悉地运行Scala解释器 scala语言运行超级素数和猴子大王 实验仪器 Virtualbox管理器 实验 ...

  5. A Scala Tutorial for Java programmers之(一)Scala入门:Scala例子,以及如何与Java交互

    本文为初学Scala的Java开发者提供了一个Scala例子(Hello world),并对Scala与Java交互的情况作了一些大致的介绍. AD: 本文源自Michel Schinz和Philip ...

  6. Scala学习--《Scala编程》

    2019独角兽企业重金招聘Python工程师标准>>> Scala学习手册--可伸缩的语言(随着使用者的需求而成长)  第一章:基本概念 Scala=FP+OO.静态语言 兼容性.简 ...

  7. Scala 简介 [摘自 Scala程序设计 ]

    Scala 简介 1.1 为什么选择Scala Scala 是一门满足现代软件工程师需求的语言:它是一门静态类型语言,支持混合范式:它也是一门运行在 JVM 之上的语言,语法简洁.优雅.灵活.Scal ...

  8. 【Scala 教程】Scala 正则表达式

    文章作者:梦家 个人站点:dreamhomes.top 原文地址:https://dreamhomes.top/713.html 公众号ID:DreamHub 本文主要介绍 Scala 中的正则表达式 ...

  9. Scala之——Scala容器库(Scala’s Collections Library)

    简介(Introduction) Martin Odersky和Lex Spoon 在许多人看来,新的集合框架是Scala 2.8中最显著的改进.此前Scala也有集合(实际上新框架大部分地兼容了旧框 ...

最新文章

  1. Vue单文件组件的使用
  2. Linux命令:MySQL系列之十--MySQL用户和权限管理,mysql管理员密码重置
  3. android 继承dialog自定义对话框
  4. 4. Median of Two Sorted Arrays
  5. MathType可以编辑省略号吗
  6. Scala教程之:PartialFunction
  7. 11 | 互联网产品的测试策略应该如何设计?
  8. Bootstrap 标签导航的布局
  9. 【Hardware】【单向可控硅基础知识】
  10. 【电子书资源】数值方法最优化理论算法凸优化 ---书籍调研(附网盘下载地址)...
  11. 供应链金融业务如何脱颖而出?
  12. uniapp 实现微信聊天效果 阻止input失焦
  13. ONF和ON.Lab合并为一 加速推进SDN落地
  14. 2021-02-02美赛前MATLAB的学习笔记(机器学习(分类、聚类、深度学习))
  15. 南卡和三星蓝牙耳机哪个戴着舒服?佩戴舒适的蓝牙耳机推荐
  16. 谈谈数据决策平台搭建的必要性
  17. 双臂二指魔方机器人的制作(一)--总体设计
  18. 从一个真实案例去思考团队的打造,以及战斗力和凝聚力的提升
  19. 数字多媒体的技术创新及发展重要性
  20. python中斜杠加引号什么意思_如何在Python中转义反斜杠和单引号或双引号?

热门文章

  1. c语言过磅系统,为什么要用无人值守_自动过磅系统?
  2. 国产数据库发展十策(三):是走MySQL路线还是PostgreSQL路线?
  3. 数据千万条,备份第一条:VFEmail被擦除所有数据面临关停
  4. 快来一起玩转LiteOS组件:Curl
  5. 大数据集群跨多版本升级、业务0中断,只因背后有TA
  6. 实战案例丨使用云连接CC和数据复制服务DRS实现跨区域RDS迁移和数据同步
  7. 【华为云技术分享】原来CTR预估模型的发展有这样的规律
  8. 【Python成长之路】词云图制作
  9. Vue中拆分视图层代码的5点建议
  10. js html转义字符串,js中html拼接特殊字符转义