太快了! Rust 太快了!

10 小时 40 分钟前
 serverKnignt

1. 背景

LZ 是一名在职的 Java boy ,花了上周一周的时间入门了 Rust 。周末使用 axum 写了个 web 项目,模拟了 SpringMVC 的架构。

2. 对比

均在我 mac 笔记本中进行测试

2.1 占用资源

这里可能不太公平。
Java 项目用了我之前的开源项目,虽然是个完整的项目但是也不是很大。没有打包成 jar ,使用 idea 启动,通过活动检测器根据 pid 查找发现占用内存494.2MB,JVM 配置:-Xms256m -Xmx4g 。
Rust 启动后发现内存占用为 2.0MB!!! 我人都傻了,虽然说是个很简单的项目,但是项目中必要的功能都有。

2.2 压测

为了进一步的看到差距,我开始了压测,代码如下。为了减少变量,没有加入 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%

1811 次点击
所在节点    Rust
22 条回复
Vraw5
10 小时 35 分钟前
op 试用一下 graalvm 打包 java 成二进制,启动很快,内存占用也很小
flytsuki
10 小时 33 分钟前
挺好的,我博客的接口就用 rust 重构了,之前用 C#和 nodejs 也重构过,现在感觉我那个双核 1G 的 vps 还能再战十年
wenning
10 小时 32 分钟前
@Vraw5 #1 graalvm 打包有没有什么坑, 之前每次想尝试,最后都觉得麻烦,特别是要打包成 exe 分发给客户,最后干脆直接让 AI 转成 go ,编译出来客户可以直接运行
serverKnignt
10 小时 32 分钟前
@Vraw5 OK 我试试
serverKnignt
10 小时 31 分钟前
@flytsuki 如果 rust 有 java 的 web 开发生态,那要变天了。。。
retrocode
10 小时 27 分钟前
前排求一份系统些的 rust 手册, 一直想学, 但是最多写了写 wasm, 直接上 web 开发老是担心后续用的组件不好找, 例如 office 文件生成, PDF 这些比较基础的功能.
Vraw5
10 小时 24 分钟前
@wenning #3 我也感觉好麻烦。可能是因为我不是 javaer 不太会用吧。
比如这个元数据我就没懂。。。
graalvm.org/latest/reference-manual/native-image/metadata/
---
只用 demo 做过一次试验,启动和内存占用确实快,二进制直接跑能 0.1 秒启动,java -jar 启动要 6 秒
serverKnignt
10 小时 23 分钟前
@retrocode 我是看官方文档和 AI 辅助学的,如果是组件的话那只能问 AI 或者 github 上找了或者自己撸一个。
w568w
10 小时 20 分钟前
在其他地方我会说你做得不错,但在 V 站我只能说 快有什么用/几百兆内存没区别/拿程序员寿命换程序寿命/过度优化/百万并发用得上吗/不如 Go 一根/Web 生态差/语法太烂/学不会/能做 Spring 级别的应用吗……

----

言归正传,OP 其实可以再看看 C#,我自己用下来的体验是 Better Java
serverKnignt
10 小时 18 分钟前
@w568w C#之前在大学里学了一学期,之后就没在看了。依稀记得之前写的是桌面应用。。。。。
knightdf
10 小时 16 分钟前
可以啊,一周就入门了
serverKnignt
9 小时 35 分钟前
@knightdf 学的时候也是难,不过我是根据我会的 java 然后让 ai 做类比,这样一步一步学的。也只是知道一些皮毛,还没去大量的写。
YsHaNg
9 小时 2 分钟前
不同领域 benchmark 真有意思 我都是来一段 prime sieve 或者 fft
ejin
8 小时 49 分钟前
一直不想学 Java ,因为各种说不好。

可是工作需要,可能最后还是要学,唉。

果然还是老人说得对,不要学 C#,学完后就学不会其他语言了(因为看不上各种垃圾语法)。
ejin
8 小时 46 分钟前
(以及其他语言各种各样的缺点)
xjzshttps
8 小时 5 分钟前
语言性能真不好说,
https://www.techempower.com/benchmarks/#section=data-r23 这个排行榜,
今年的第一居然是 python 写的,这个感觉真的离谱,我印象 python 解释执行,一直印象比编译型低很多。
bunny189
7 小时 11 分钟前
@xjzshttps +1 ,这玩意儿真不好说,而且写代码的人水平也有参差……emm 。让 AI 写 go 和 rust 代码,同样在我的 Mac 上编译,Go 更快
--------
我觉得大部分项目最敏感的还是资源占用,至少本个人开发者是这么认为的
cmdOptionKana
6 小时 57 分钟前
@xjzshttps 没看具体代码,可能因为 python 调用了 C 写的库
bobox
6 小时 43 分钟前
孩子,多玩几年再来说这种话。真正上了项目就发现,代码再快也没啥鸟用,瓶颈都在数据库那块。
ajaxgoldfish0
6 小时 19 分钟前
很少有卡在业务本体的,大部分都是卡在数据库、中间件、网络 IO 上。

虽然干活用 C++ 但是还是最喜欢 Python 和 js ,没有心智负担,写代码就像说话一样,舒服至极。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1160285

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX