LZ 是一名在职的 Java boy ,花了上周一周的时间入门了 Rust 。周末使用 axum 写了个 web 项目,模拟了 SpringMVC 的架构。
均在我 mac 笔记本中进行测试
这里可能不太公平。
Java 项目用了我之前的开源项目,虽然是个完整的项目但是也不是很大。没有打包成 jar ,使用 idea 启动,通过活动检测器根据 pid 查找发现占用内存494.2MB,JVM 配置:-Xms256m -Xmx4g 。
Rust 启动后发现内存占用为 2.0MB!!! 我人都傻了,虽然说是个很简单的项目,但是项目中必要的功能都有。
为了进一步的看到差距,我开始了压测,代码如下。为了减少变量,没有加入 IO 操作,但也是正常的业务功能。
JAVA
@Override public AiUserVO loginTest(AiUserReq userReq) { CommonUtils.checkArgs(userReq.getAccountNo(),userReq.getPassword()); AiUser user = AiUser.builder().accountNo("admin").password("admin").name("admin").build(); user.setId(1941040891798581249L); //校验登录 // checkLogin(user,userReq); AiUserVO result = ConvertUtils.beanProcess(user, AiUserVO.class); //处理用户角色 // processUserRole(user,result); //生成 token String token = genToken(user); result.setToken(token); //放入 redis String key = CacheKeyEnum.format(CacheKeyEnum.ADMIN_LOGIN_KEY,user.getId(),token); SysCacheUserDto sysCacheUserDto = ConvertUtils.beanProcess(result, SysCacheUserDto.class); //删除原始 token // removeToken(user.getId()); // redisCacheComponent.set(key,JSONObject.toJSONString(sysCacheUserDto),TimeConstant.ONE_DAY * 12); return result; }
RUST
pub async fn login(user:UserReq)->Res<UserVO> { // 查询逻辑 let user_do = match query_user(&user.account_no, &user.password).await { Some(user_do) => user_do, NOne=> return Res::build(FAIL), }; let mut user_vo:UserVO = user_do.into(); //加密 let token = match security_utils::aes_encrypt(&user_vo.id.to_string()) { Ok(token) => token, Err(_) => return Res::build(FAIL), }; user_vo.token = token; let key = SYSTEM_USER.key().format(&[&user_vo.id.to_string()]); //删除缓存 GlobalCache::del(&key); //放入缓存 GlobalCache::set(key,serde_json::to_string(&user_vo).unwrap()); Res::success(user_vo) } /** * 查询用户 */ async fn query_user(account_no:&str,pwd:&str)->Option<UserDO> { let user = UserDO{ id:1912753992656158721, name:"admin".to_string(), account_no:"admin".to_string(), status:true, }; Some(user) }
压测配置如下
Name: 线程组-30 Number of Threads: 200 Ramp-Up Period: 30 Loop Count: 1 Scheduler: Duration: 90 Name: 线程组-90 Number of Threads: 200 Ramp-Up Period: 30 Loop Count: 1 Scheduler: Startup Delay: 90 Duration: 90
压测流程如下
阶段一:0~30 秒启动 200 线程 → 持续到第 90 秒 阶段二:从第 90 秒开始,30 秒内启动 300 线程 → 持续到第 180 秒
指标 | RUST | JAVA | 差异 |
---|---|---|---|
平均响应时间 | 3~4 ms | 6~8 ms | ↑ 上升 50%~100% |
最大响应时间 | 17 ms | 26 ms | ↑ 上升 53% |
99% 百分位 | 11~15 ms | 15~20 ms | ↑ 上升 30%~45% |
吞吐量 | 6.7 → 10.0 req/sec | 6.7 → 10.0 req/sec | 相同 |
异常率 | 0% | 0% | 相同 |
数据包大小 | 294 B | 489 B | ↑ 增加 66% |
1 Vraw5 21 天前 op 试用一下 graalvm 打包 java 成二进制,启动很快,内存占用也很小 |
2 flytsuki 21 天前 挺好的,我博客的接口就用 rust 重构了,之前用 C#和 nodejs 也重构过,现在感觉我那个双核 1G 的 vps 还能再战十年 |
![]() | 3 wenning 21 天前 @Vraw5 #1 graalvm 打包有没有什么坑, 之前每次想尝试,最后都觉得麻烦,特别是要打包成 exe 分发给客户,最后干脆直接让 AI 转成 go ,编译出来客户可以直接运行 |
![]() | 6 cvooc 21 天前 前排求一份系统些的 rust 手册, 一直想学, 但是最多写了写 wasm, 直接上 web 开发老是担心后续用的组件不好找, 例如 office 文件生成, PDF 这些比较基础的功能. |
7 Vraw5 21 天前 @wenning #3 我也感觉好麻烦。可能是因为我不是 javaer 不太会用吧。 比如这个元数据我就没懂。。。 graalvm.org/latest/reference-manual/native-image/metadata/ --- 只用 demo 做过一次试验,启动和内存占用确实快,二进制直接跑能 0.1 秒启动,java -jar 启动要 6 秒 |
9 w568w 21 天前 ![]() 在其他地方我会说你做得不错,但在 V 站我只能说 快有什么用/几百兆内存没区别/拿程序员寿命换程序寿命/过度优化/百万并发用得上吗/不如 Go 一根/Web 生态差/语法太烂/学不会/能做 Spring 级别的应用吗…… ---- 言归正传,OP 其实可以再看看 C#,我自己用下来的体验是 Better Java |
![]() | 11 knightdf 21 天前 可以啊,一周就入门了 |
13 YsHaNg 21 天前 不同领域 benchmark 真有意思 我都是来一段 prime sieve 或者 fft |
![]() | 14 ejin 21 天前 ![]() 一直不想学 Java ,因为各种说不好。 可是工作需要,可能最后还是要学,唉。 果然还是老人说得对,不要学 C#,学完后就学不会其他语言了(因为看不上各种垃圾语法)。 |
![]() | 15 ejin 21 天前 (以及其他语言各种各样的缺点) |
16 xjzshttps 21 天前 语言性能真不好说, 看 https://www.techempower.com/benchmarks/#section=data-r23 这个排行榜, 今年的第一居然是 python 写的,这个感觉真的离谱,我印象 python 解释执行,一直印象比编译型低很多。 |
17 bunny189 21 天前 via iPhone @xjzshttps +1 ,这玩意儿真不好说,而且写代码的人水平也有参差……emm 。让 AI 写 go 和 rust 代码,同样在我的 Mac 上编译,Go 更快 -------- 我觉得大部分项目最敏感的还是资源占用,至少本个人开发者是这么认为的 |
![]() | 18 cmdOptionKana 21 天前 @xjzshttps 没看具体代码,可能因为 python 调用了 C 写的库 |
19 bobox 20 天前 孩子,多玩几年再来说这种话。真正上了项目就发现,代码再快也没啥鸟用,瓶颈都在数据库那块。 |
![]() | 20 iF0oo2txTX91o9Sg 20 天前 很少有卡在业务本体的,大部分都是卡在数据库、中间件、网络 IO 上。 虽然干活用 C++ 但是还是最喜欢 Python 和 js ,没有心智负担,写代码就像说话一样,舒服至极。 |
21 Georgedoe 20 天前 via Android 写业务代码快才是真的快,程序跑的快不快和我有啥关系(狗头) |
![]() | 22 zpvip 20 天前 ![]() 还是太年轻了, 快有什么用, 小网站不差几毫秒, 大网站堆机器, 便宜得很. 用 Rust 写 Web, 这是没有困难创造困难. Web 界我只推 Ruby on Rails, 虽然 js, php, Java, C# 更流行, 但这是老板思维, 招人容易, 开人没负担, 工资给得低, 还随便 PUA. 从程序员的角度, 还是 Ruby on Rails 好用. 如果程序员不改变想法, 都替老板着想, 只能让好的东西埋没, 整天被限制在所谓工程化的泥沼中当螺丝钉. |
![]() | 23 VeryZero 20 天前 让我想起来某次代码评审,有人让我少用 System.currentTimeMillis(),能省一点是一点,积少成多,宁愿不要时间统计的功能 |
![]() | 24 montaro2017 20 天前 |
25 nebkad 20 天前 @zpvip 非常赞同你所说的 “如果程序员不改变想法, 都替老板着想, 只能让好的东西埋没 ” 我一直都觉得 Java 甚至 golang 这种编程语言,都是为了过度分工的大规模开发而设计的编程语言。 特点是语法不花哨,但是语言表现力也差,不适合自由程序员协作,倒是适合码农协作。 所以像 Rust 这种,对性能敏感,表现力也还可以的语言,才是自由程序员们依靠自身技艺水平,击败累赘堆砌代码的项目的杀手锏。 以上观点,请你批评。 |
![]() | 26 zengxs 19 天前 Rust 做业务太费劲了,只适合做那种代码逻辑长期稳定的项目 |
![]() | 27 cabing 4 天前 适合底层项目。业务代码 java ,go ,php ,python 更好用啊。 |