查看了 binarytrees 这部分的代码,分析一下为什么 Go 会明显的比其它语言比如C/C++/Java/C# 慢了很多,前者基本10秒以内,而 Go 版本要 30s~40s。首先要排除 C/C++ 版本,这两个版本作弊了——提前申请了内存池。不过自定义内存申请在C/C++上也是常见的动作所以也不能说不可以。为什么 Java/C# 也会比 Go 快呢?这是垃圾回收策略导致的,Golang 默认一种垃圾回收策略,走的是高频次低延迟的路线,而默认Java/C#是高吞吐量高延迟的,所以这点非常不利于Go的性能表现。如果是游戏的话,用java实现会出现周期性的卡顿现象,如果是 Go 的话就不会有这种现象,这是高频低延的好处。另外这个案例也切中了Java/C#的分代垃圾回收算法,大量的小内存在复制回收算法中是非常快的。不过Go可以做的更快 —— 实现定义的内存池,这样的话它的速度应该可以接近C/C++的实现,事实上有人提交过这样的代码被拒了,这种思路在 Java 上是无法实现的因为Java的内存分布是JVM控制的无法自定义内存,用C#的struct应该也可以达到类似的效果。从语言对内存管理的天然亲昵性来看:C/C++ > Go > C# > Java 的,这个特性其实决定了已经优化过执行策略的语言的性能上限,这是因为现在的CPU瓶颈往往在于内存加载使用连续分布的内存才能实现更快的应用。
我们在做游戏引擎的时候(基于Golang)也大量使用了类似的思路来管理内存速度极快。有兴趣的同学可以看下:KorokEngine/Korok 。个人觉得,Go 是可以上达 C/C++ 下也可以跟 Java/C# 并排跑的,考虑到应用场景这并不奇怪。