JAVA转GO的初感受

sanrentai · 2020-12-30 10:36:56 · 2829 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2020-12-30 10:36:56 的主题,其中的信息可能已经有所发展或是发生改变。

之前在一直在用JAVA开发,从JAVA的 EJB 到流行的 Spring,总体感受开发速度尚可,不用重复造轮子,启动慢,内存占用高,单机并发量低。某次需要开发一个功能简单的服务,开发过程很顺利,上线部署发现,需要先装 jre 才能运行,程序本身不大,但是所需要的运行环境太大了,不适合快速部署。2018年的某一天,偶然间看到了go语言,尝试一下,把JAVA程序,用GO实现一遍,结果是程序体积小,可以直接运行,占用内存特别低(不到JAVA的十分之一),并发量高(据说相当与nginx),编译运行速度快(开发效率高,JAVA一个项目编译运行,没个3-5分钟都启动不来,影响开发效率),相对而言,目前go的各种库相对JAVA要少,但也有很多可以直接用的库,比如我常用的Goframe 几乎包含各种需要的功能(webserver,orm,config,cache)


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

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2829 次点击  ∙  1 赞  
加入收藏 微博
12 回复  |  直到 2020-12-31 10:00:15
focusonline
focusonline · #1 · 4年之前

有没有遇到过坑?

zzustu
zzustu · #2 · 4年之前

有点低估Java高估Go的速度了

focusonline
focusonline · #3 · 4年之前
zzustuzzustu #2 回复

有点低估Java高估Go的速度了

确实, java如果充分预热, 速度是要比go快的.这点早就被证明过了,事实上, 如果java充分优化过的运行时代码是可以和C相媲美的.加上异步框架netty之类的加成和一些特殊指令的运用, java的并发并不比go差多少的. java的劣势其实在于有商业授权问题 , 还有加上框架的发布包过于臃肿肥大, 各种依赖层层叠嶂很容易遇到版本问题, 随便一个像样的发布包就有几十M, cicd打包编译都要好久.而且如果是商业分发产品而不是自营的还有源码泄露的危险, 这些go都完美避开. 另外java的内存消耗也比go大, 配置较低的机器go能输出更高一些的产能.比较适合资金比较紧张的初创公司.

zzustu
zzustu · #4 · 4年之前
focusonlinefocusonline #3 回复

#2楼 @zzustu 确实, java如果充分预热, 速度是要比go快的.这点早就被证明过了,事实上, 如果java充分优化过的运行时代码是可以和C相媲美的.加上异步框架netty之类的加成和一些特殊指令的运用, java的并发并不比go差多少的. java的劣势其实在于有商业授权问题 , 还有加上框架的发布包过于臃肿肥大, 各种依赖层层叠嶂很容易遇到版本问题, 随便一个像样的发布包就有几十M, cicd打包编译都要好久.而且如果是商业分发产品而不是自营的还有源码泄露的危险, 这些go都完美避开. 另外java的内存消耗也比go大, 配置较低的机器go能输出更高一些的产能.比较适合资金比较紧张的初创公司.

有道理,老哥我看你活跃度挺高的呀

sanrentai
sanrentai · #5 · 4年之前
focusonlinefocusonline #3 回复

#2楼 @zzustu 确实, java如果充分预热, 速度是要比go快的.这点早就被证明过了,事实上, 如果java充分优化过的运行时代码是可以和C相媲美的.加上异步框架netty之类的加成和一些特殊指令的运用, java的并发并不比go差多少的. java的劣势其实在于有商业授权问题 , 还有加上框架的发布包过于臃肿肥大, 各种依赖层层叠嶂很容易遇到版本问题, 随便一个像样的发布包就有几十M, cicd打包编译都要好久.而且如果是商业分发产品而不是自营的还有源码泄露的危险, 这些go都完美避开. 另外java的内存消耗也比go大, 配置较低的机器go能输出更高一些的产能.比较适合资金比较紧张的初创公司.

如果java充分优化过的运行时代码是可以和C相媲美的 java充分优化过的运行时代码 , 不太理解,求教

focusonline
focusonline · #6 · 4年之前
zzustuzzustu #4 回复

#3楼 @focusonline 有道理,老哥我看你活跃度挺高的呀

我啊, 社会闲散人员一名, 拜山头求大佬阶段中不得不活跃一下子... 哈哈哈

sanrentai
sanrentai · #7 · 4年之前
zzustuzzustu #2 回复

有点低估Java高估Go的速度了

我说的是JAVA程序代码在编译打包成 war包或者jar包时,比 go 编译成可执行程序要慢。

启动Java的速度要比 go慢,比如springboot程序还没启动完毕,go的代码已经可以收到客户端的请求了。

而不是比较两者的执行效率,目前执行效率上的快慢没有意义。目前最耗时的是网络。

focusonline
focusonline · #8 · 4年之前
sanrentaisanrentai #5 回复

#3楼 @focusonline 如果java充分优化过的运行时代码是可以和C相媲美的 java充分优化过的运行时代码 , 不太理解,求教

这个其实没啥不好理解的, 你百度一下答案一大堆, java有hotspot JIT技术, 可以把热代码直接编译成本地机器码运行, 而且还是那种充分优化过的. 因为java热好的熟代码已经充分知道怎么优化达到最大的效能. 这点不必惊讶, 其他有JIT技术的虚拟机也有同样的特性, 比如现在奋起直追的php8也要引入JIT了.以前做过类似的测试, 结果确实很让人吃惊java快得吓人, 所以所谓的编译型语言编译出来的可执行文件执行效率一定高于快于解释型的语言是不正确的, 起码在一定的前提下是不能这么说的(比如阅后即焚不给java充足的时间加热代码).

focusonline
focusonline · #9 · 4年之前
sanrentaisanrentai #5 回复

#3楼 @focusonline 如果java充分优化过的运行时代码是可以和C相媲美的 java充分优化过的运行时代码 , 不太理解,求教

话题切换到go上, go的生成代码大多数情况下是比java快的,起码持平, 但是却不敌java热过的代码, 因为go的优化做的很一般, 毕竟是带GC的语言, 有指针这种东西就没办法优化到哪里去, 否则到处都是空指针异常就尴尬了. 话说编译速度很快的编译型语言优化都做的一般, 同理还有pascal(delphi), 编译也超级快就是运行速度一般, 比不上编译速度超级慢的C/C++

focusonline
focusonline · #10 · 4年之前
sanrentaisanrentai #7 回复

#2楼 @zzustu 我说的是JAVA程序代码在编译打包成 war包或者jar包时,比 go 编译成可执行程序要慢。 启动Java的速度要比 go慢,比如springboot程序还没启动完毕,go的代码已经可以收到客户端的请求了。 而不是比较两者的执行效率,目前执行效率上的快慢没有意义。目前最耗时的是网络。

也不能说瓶颈都在网络上, 在同等硬件条件下运行效率高资源需求小的程序还是更有意义的. 比如我忘了是哪里的案例, 之前是全都用python 还是php来着, 后来替换成go, 同样的服务器并发量更大了, 甚至极端情况下, 做到同样的效果都能省掉几台昂贵的服务器, 这就很有意义了.

zzustu
zzustu · #11 · 4年之前

这个案例是逼乎在Gopher China大会上吹得牛逼 https://b23.tv/oAZAHS

focusonline
focusonline · #12 · 4年之前
zzustuzzustu #11 回复

这个案例是逼乎在Gopher China大会上吹得牛逼 https://b23.tv/oAZAHS

哈哈哈是不是真的催牛逼这个不好说, 但是python是出了名的慢这个是没跑的除非接受很多的编码限制编译成exe.逼乎之前也是python后来切换到go了. 我觉得不必因此而迷信go有多好, 只是适合就行了.go的未来还是比较光明的, 我觉得相比之下, rust和D语言反而一般.虽然rust有巨硬站台. 但是和C/C++相比也没啥特别突出的优势.D语言就更不用说了, 也是带GC的语言, 虽然语法模型比golang好很多些业务犀利很多, 但是太小众轮子太少了.

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传