有朋友说抛开应用场景谈性能都是耍流氓,我的应用场景都还是挺典型的,就是普通的后端微服务实现,cpu和io的密度比较平衡,有的可能IO略重一些,有的cpu略重一些。
我实际用下来的体会是,Java(其实主要是scala)和Go在后端服务应用的性能是差不多的,延时的差别几乎可以忽略不计。反正我是感觉不出来。当然,我也没闲的那么蛋疼做过完全一样的Java 和Go的服务来比较,我只能大致的感觉。
还有说go内存高效的,这个要具体看,不能那么武断,jvm的内存使用也是很高效的。有人说java的各种框架一装入就占多少内存,你真的细看过吗?这些内存都是被用在哪里?对于后端服务来说,heap中主要还是为每个请求所创建的对象为主。一段时间内(我们可以想象为GC的周期,其实并不完全等同),请求越多,占用的内存就越多。
题主说JIT应该比静态编译运行速度慢,这还真不是。要这么看, JIT也是会把很多代码(不一定是全部)编译成机器代码的,一旦JIT编译完成,这个执行速度就和静态编译的效果差不多了,甚至可能更快,因为go还不能算是一个充分优化的编译器。
JIT的编译代价尽管还挺大的,但是它是一次性的,而且即时编译并不是在class装入时一次性做完的。所以你要写个小算法,它还真未必能把jit给调动起来,或者调动起来总cpu时间也还是挺高的。但是对于后端服务来说,是常用方法的高频反复调用,JIT的效果还是非常明显的。