- 学一门语言,最好的方式对我而言,是实现一个框架
- 迄今,实现了3个框架
框架大致介绍
- 成熟度:Java 最成熟,并且也已用于生产环境,Go其次, Rust为近期才完成
- 语言熟悉度: Java=Go>Rust
- 设计思想: 核心只有一个: cdi (context with dependency inject),Go,Rust的框架都源自于Java框架,而Java框架源于Spring,所以可以认为所有的3个框架的核心都是Spring的思想, 但是不会为了ioc 而ioc,导致复杂度几何级上升,3个框架都是实现了功能上的解耦,以插件的形式组合形成一个应用
- 编码思路: 三个框架的编码可以说是一模一样吧,同种思路不同实现而已,Java是注解,Go则是标签,Rust则是宏. 同时编码本来就是A借鉴B,B借鉴C的过程,所以所有框架的实现都借鉴了部分开源代码的实现, 算是活学活用吧,看了很多框架的源码
- Java: spring,springboot-grpc,netty,fabric-sdk-java,rpcx-java,distributor(这个不是非常熟悉)
- Go: rpcx,Hyperledger-Fabric/Fabric-ca ,ipfs,gin,tendermint,cosmos-sdk,libp2p
- Rust: rust确切的说,整体不是非常非常熟悉,但是也大致借鉴了怎么玩的,也是一门挺有意思的语言. 主要是借鉴的tokio 和rocket
- 从开始到基础搭建结束耗时时间而言, Rust>Java>Go,Java大概写了一个月左右吧,Go 很快,基于Java基础的设计,不到一个月就写完了,而Rust 中途磨磨唧唧了挺长一段时间,所以大概是2个月左右搞完(实际编码可能也是1个月吧),这2个月是从0开始边学边写
本篇博文的目的
- 目的很简单,只有一个,那就是测试下框架的一些基础性能
- rest 方面的qps
- … 有想到再补…
压测环境
- 工具
- jmeter
- 配置
- 自身的开发机,mac m1 max 64G,24C
- 压测方案
- 1000线程
- 2000线程
- 5000线程
- 10000线程
- rest qps
- 每个框架都会携带 100个api接口
- jmeter随机[1-100]请求,计算qps
- Java 会进行预热处理,但是不会进行额外的gc调优(因为不会~,最好的调优方式就是升级jdk,目前为11)
预期结果
- 预期的话,Rust 会qps最高,Go>=Java,原因的话
- 一部分与编码有关,Go的逻辑处理都是没开routine的我记得,Java都是开了threadpool进行处理,Rust的话,全程异步routine的形式
- 语言方面,无GC的语言自然要比GC语言性能高,但是Go和Java相比的话,Go生态上对标的是Java,虽然号称就是比Java快,但这也太小看Java 了,小看JIT,小看Netty了, 但是Java框架,是在Spring基础上再封装,而Spring已经在servlet基础封装过了,所以多次封装必然会带来性能上的损失
- 测试有关, 压测并不规范,下次压测开始时系统运行情况不会与上次相同,没有控制变量
实际结果
- qps
- 1000线程
- Java: 30820.10/s
- Go: 38862.74/s
- Rust:55222.67/s
- 后续再继续~