V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
serverKnignt
V2EX  ›  Rust

太快了! Rust 太快了!

  •  
  •   serverKnignt · 8 小时 53 分钟前 · 1765 次点击

    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%

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

    ----

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

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

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

    虽然干活用 C++ 但是还是最喜欢 Python 和 js ,没有心智负担,写代码就像说话一样,舒服至极。
    Georgedoe
        21
    Georgedoe  
       3 小时 49 分钟前 via Android
    写业务代码快才是真的快,程序跑的快不快和我有啥关系(狗头)
    zpvip
        22
    zpvip  
       1 小时 29 分钟前
    还是太年轻了, 快有什么用, 小网站不差几毫秒, 大网站堆机器, 便宜得很. 用 Rust 写 Web, 这是没有困难创造困难.

    Web 界我只推 Ruby on Rails, 虽然 js, php, Java, C# 更流行, 但这是老板思维, 招人容易, 开人没负担, 工资给得低, 还随便 PUA. 从程序员的角度, 还是 Ruby on Rails 好用.

    如果程序员不改变想法, 都替老板着想, 只能让好的东西埋没, 整天被限制在所谓工程化的泥沼中当螺丝钉.
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1004 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:41 · PVG 02:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.