首页 健康生活文章正文

Go与Java性能PK赛解析

健康生活 2025年07月27日 22:36 1 admin

有个叫Anton的油管博主做了个性能PK赛,让Java(穿了个叫Quarkus的马甲)和Go(穿着Fiber战袍)两个选手比赛写网站接口。我本来以为Go语言这种编程界的刘翔,肯定能把Java和C#这些带垃圾回收的选手甩开十条街!结果你猜怎么着?Go就比Java快了那么一丢丢,跟我想象的完全不一样啊!

Go与Java性能PK赛解析

重点来了:
这个Go选手还穿了双"快跑鞋"——用了Fiber这个比Go自带的http工具跑得更快的框架

比赛项目有两个:

  • 第一个是"秒回短信"测试:让服务器快速回个UUID的微信红包
  • 第二个是"网管小哥日常"测试:要先把文件存电脑,再上传到亚马逊网盘,最后还要记小本本(Postgres数据库),这个简直就跟真实工作场景一模一样!

我现在正在学Go语言呢,各位大佬快来评论区支支招,告诉Anton还能怎么给Go程序"打鸡血"!虽然我知道这几秒钟的差距对实际工作来说毛用没有...但就是好奇得心里痒痒啊!就像明明知道泡面早泡1分钟也不会更好吃,但就是忍不住想提前开盖!

网友老铁:
1、网络IO比磁盘IO慢,磁盘IO比内存IO慢,内存IO比单纯的数字运算慢。移动数据比CPU运行速度慢,真是让人抓狂。
这通常是为什么 python 非常适合处理大量 HTTP API 的原因,因为等待网络调用解析(数据库等)的时间通常占处理程序执行时间的很大一部分,因此 python 速度极慢的事实相比之下就显得微不足道了。

如果您的瓶颈是网络调用,那么使用 C 或 Rust 或 Go 或 Java 或 Python 或 JavaScript 都没有关系。

2、网络调用之所以不合理,原因比大多数人想象的要多:

  1. 增加延迟的路径不止一条。如今,请求/命令/事件在不同的微服务之间来回传递时,通常需要多个步骤。即使在同一个区域/数据中心内,这也会造成延迟。
  2. 在整个路径的每一步,序列化和反序列化都会产生开销。这会占用大量 CPU,并导致大量频繁且微小的堆内存分配。
  3. 每个请求通常涉及多个串行调用,这在数据库中称为“N+1 问题”。但其他类型的调用也存在同样的问题。如果调用没有流水线化(即没有利用并发),延迟会大幅增加。
  4. 在整个请求期间,您必须占用 RAM。如果延迟增加 2 倍,那么在其他条件相同的情况下,您的 RAM 实际使用量也会增加 2 倍。这是因为内存需要保留更长时间,这意味着它会更频繁地与其他请求重叠。
  5. 随着服务调用次数的增加,您需要传输的数据总量也会随之增加,这会增加网络链路的负载,并可能导致带宽限制和拥塞。如果情况发展到这种程度,很快就会失控。


简而言之,微服务架构是让应用程序运行速度变慢、难以预测且成本高昂的最佳方法之一。仅在必要时使用它们。

别动不动就想着“优化性能”,除非你明确知道它真的会成为瓶颈。不然就是浪费时间,还不如先把代码写清楚、写稳定。

  • 就像你写作业,如果明明手写就能交差,非要去研究“用什么笔写字最快”,那不是闲得慌吗?等哪天作业多到手写不完的时候,再考虑换打字也不迟!
  • 你平时骑共享单车去买菜,根本没必要纠结单车是不是碳纤维的!除非你确定自己要参加环法自行车赛,否则瞎折腾这些性能优化纯属吃饱了撑的!

3、性能这个词毫无意义,关键指标是延迟和吞吐量。
在 IO 场景中,延迟主要受网络延迟的影响。只要网络延迟较大(例如 100 毫秒),大多数语言在进行单次 IO 调用并返回结果时,延迟大致相同。如果网络延迟较小(例如 3 毫秒),5 毫秒的总时间与 4 毫秒的总时间之间的差异在百分比上会相当大,但绝对值上可能并不重要。

另一方面,如果你进行多次调用,延迟下降会立即显现出来,差异也会随之增大。即使使用相同的语言,异步 IO 与非异步 IO 场景下这一点也最为明显。诸如锁、缓存破坏、内存复制等操作在高负载下会开始占据主导地位。

现在我们来谈谈吞吐量。
本质上,吞吐量取决于两个因素:数据源吞吐量(比如数据库)以及调用代码的调用和结果处理性能。本质上,由于更少的 CPU 流水线停顿、更少的页面错误、更低的 GC 暂停等等,你可以在保持相同延迟的情况下,每个 vCore 每秒处理更多请求。

另外,如果你构建一个系统,你可以在延迟和吞吐量之间进行权衡(虽然听起来很奇怪)。你也可以在非常好的 p90(1ms)和糟糕的 p99(10ms)之间进行选择,或者说,稍微差一点的 p90(1.2ms)和非常好的 p99(3ms)。

实际上,这取决于工作量和你的需求。而且人们忘记了 Java 的优化程度相当高,可以生成比 GO 更好的汇编代码。

总之:要关注客户端的延迟,越快越好,同时要关注CPU并发处理量,同时处理的请求越多越好。
CPU负载要加满,客户要秒现。
发动机油门踩到底,一秒加速到100公里。

Go与Java性能PK赛解析 - 极道

发表评论

泰日号Copyright Your WebSite.Some Rights Reserved. 网站地图 备案号:川ICP备66666666号 Z-BlogPHP强力驱动