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 8 小时 48 分钟前
op 试用一下 graalvm 打包 java 成二进制,启动很快,内存占用也很小
|
2
flytsuki 8 小时 46 分钟前
挺好的,我博客的接口就用 rust 重构了,之前用 C#和 nodejs 也重构过,现在感觉我那个双核 1G 的 vps 还能再战十年
|
![]() |
3
wenning 8 小时 46 分钟前
@Vraw5 #1 graalvm 打包有没有什么坑, 之前每次想尝试,最后都觉得麻烦,特别是要打包成 exe 分发给客户,最后干脆直接让 AI 转成 go ,编译出来客户可以直接运行
|
![]() |
4
serverKnignt OP @Vraw5 OK 我试试
|
![]() |
5
serverKnignt OP @flytsuki 如果 rust 有 java 的 web 开发生态,那要变天了。。。
|
![]() |
6
retrocode 8 小时 40 分钟前
前排求一份系统些的 rust 手册, 一直想学, 但是最多写了写 wasm, 直接上 web 开发老是担心后续用的组件不好找, 例如 office 文件生成, PDF 这些比较基础的功能.
|
7
Vraw5 8 小时 38 分钟前
@wenning #3 我也感觉好麻烦。可能是因为我不是 javaer 不太会用吧。
比如这个元数据我就没懂。。。 graalvm.org/latest/reference-manual/native-image/metadata/ --- 只用 demo 做过一次试验,启动和内存占用确实快,二进制直接跑能 0.1 秒启动,java -jar 启动要 6 秒 |
![]() |
8
serverKnignt OP @retrocode 我是看官方文档和 AI 辅助学的,如果是组件的话那只能问 AI 或者 github 上找了或者自己撸一个。
|
9
w568w 8 小时 33 分钟前 ![]() 在其他地方我会说你做得不错,但在 V 站我只能说 快有什么用/几百兆内存没区别/拿程序员寿命换程序寿命/过度优化/百万并发用得上吗/不如 Go 一根/Web 生态差/语法太烂/学不会/能做 Spring 级别的应用吗……
---- 言归正传,OP 其实可以再看看 C#,我自己用下来的体验是 Better Java |
![]() |
10
serverKnignt OP @w568w
![]() |
![]() |
11
knightdf 8 小时 29 分钟前
可以啊,一周就入门了
|
![]() |
12
serverKnignt OP @knightdf 学的时候也是难,不过我是根据我会的 java 然后让 ai 做类比,这样一步一步学的。也只是知道一些皮毛,还没去大量的写。
|
13
YsHaNg 7 小时 15 分钟前
不同领域 benchmark 真有意思 我都是来一段 prime sieve 或者 fft
|
![]() |
14
ejin 7 小时 2 分钟前 ![]() 一直不想学 Java ,因为各种说不好。
可是工作需要,可能最后还是要学,唉。 果然还是老人说得对,不要学 C#,学完后就学不会其他语言了(因为看不上各种垃圾语法)。 |
![]() |
15
ejin 6 小时 59 分钟前
(以及其他语言各种各样的缺点)
|
16
xjzshttps 6 小时 18 分钟前
语言性能真不好说,
看 https://www.techempower.com/benchmarks/#section=data-r23 这个排行榜, 今年的第一居然是 python 写的,这个感觉真的离谱,我印象 python 解释执行,一直印象比编译型低很多。 |
17
bunny189 5 小时 24 分钟前 via iPhone
@xjzshttps +1 ,这玩意儿真不好说,而且写代码的人水平也有参差……emm 。让 AI 写 go 和 rust 代码,同样在我的 Mac 上编译,Go 更快
-------- 我觉得大部分项目最敏感的还是资源占用,至少本个人开发者是这么认为的 |
![]() |
18
cmdOptionKana 5 小时 10 分钟前
@xjzshttps 没看具体代码,可能因为 python 调用了 C 写的库
|
19
bobox 4 小时 56 分钟前
孩子,多玩几年再来说这种话。真正上了项目就发现,代码再快也没啥鸟用,瓶颈都在数据库那块。
|
20
ajaxgoldfish0 4 小时 32 分钟前
很少有卡在业务本体的,大部分都是卡在数据库、中间件、网络 IO 上。
虽然干活用 C++ 但是还是最喜欢 Python 和 js ,没有心智负担,写代码就像说话一样,舒服至极。 |
21
Georgedoe 3 小时 49 分钟前 via Android
写业务代码快才是真的快,程序跑的快不快和我有啥关系(狗头)
|
![]() |
22
zpvip 1 小时 29 分钟前
还是太年轻了, 快有什么用, 小网站不差几毫秒, 大网站堆机器, 便宜得很. 用 Rust 写 Web, 这是没有困难创造困难.
Web 界我只推 Ruby on Rails, 虽然 js, php, Java, C# 更流行, 但这是老板思维, 招人容易, 开人没负担, 工资给得低, 还随便 PUA. 从程序员的角度, 还是 Ruby on Rails 好用. 如果程序员不改变想法, 都替老板着想, 只能让好的东西埋没, 整天被限制在所谓工程化的泥沼中当螺丝钉. |