百科问答小站 logo
百科问答小站 font logo



为什么 Go 语言在某些方面的性能还不如 Java? 第1页

  

user avatar   liu-zhao-yun 网友的相关建议: 
      

查看了 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# 并排跑的,考虑到应用场景这并不奇怪。




  

相关话题

  Rust, Go 等新兴语言未来在国内好不好找工作? 
  使用 Unix Domain Socket 连接 MySQL,查询速度和使用 127.0.0.1 连接差不多,使用 Go 测试,为什么? 
  为什么 Go 语言如此不受待见? 
  用GO重写Linux可行吗? 
  怎么看 Go 语言依赖需要 Git 仓库可读权限? 
  Go 语言的错误处理机制是一个优秀的设计吗? 
  为什么Python,Go,Rust等新语言都不支持函数重载? 
  为什么 Go 语言在某些方面的性能还不如 Java? 
  使用 Unix Domain Socket 连接 MySQL,查询速度和使用 127.0.0.1 连接差不多,使用 Go 测试,为什么? 
  C++20 即将到来的 coroutine 能否与 Golang 的 goroutine 媲美? 

前一个讨论
在5G的运用上,世界上多数ICT公司都没有选择矿山为突破口,而华为把矿山作为切入点,如何看待这一选择?
下一个讨论
如何评价 C++ 11 auto 关键字?





© 2025-04-11 - tinynew.org. All Rights Reserved.
© 2025-04-11 - tinynew.org. 保留所有权利