惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
B
Blog
罗磊的独立博客
GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
宝玉的分享
宝玉的分享
The GitHub Blog
The GitHub Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
博客园 - 聂微东
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
MyScale Blog
MyScale Blog
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏

Rust

Tower 限流中间件,主要面向 HTTP 服务,专注固定窗口限流。 - V2EX 折腾了一阵 Rust + Cosmopolitan, 搭了套工具链,现在能把一些常用的 cli 工具编译到 APE 了 - V2EX [开源自推]我用 Rust 做了一个约 30 MiB 内存的多入口 AI Agent,已经在线跑了半年 - V2EX [开源] rload: 仅 3.5MB 内存,原生支持 Nginx 日志回放的 Rust 高性能压测工具 - V2EX RustScript: 给你的 Rust 项目带来脚本化功能 RUST 语法极其丑陋 一款跑在终端里的本地优先密码管理器,用全屏 TUI 管理账号、密钥和安全笔记。 如何理解 rust 闭包的借用值机制? 被借用的值在闭包内到底是什么类型? [开源] Best of RS - 一个由 Rust 编写的追踪 Rust 开源趋势的全栈 web 项目 Rust 真是非常适合 AI vibe coding 的语言 Pumpkin - 使用 Rust 开发的高性能 Minecraft 服务端 开源这两天 Vibe 的 Rust 重写的 OpenClaw 用 rust 写了一个非常简单的局域网文本同步的小玩意 [寻求帮助 Linux ] 用 rust 写了一个跨平台输入监听库(鼠标键盘) Contributions to Rust and LLVM in 2025 Linux 内核中的 rust 2025 年度 Rust 语言社区调查 已经发布 rust 让我抓狂、擦汗 推荐一款我写的动态配置语言: Faml 如何看待 Rust? Rust Web 开发脚手架 v0.6 发布啦! rathole 这个项目是不维护了吗? 之前那个 rust 贡献大佬找到工作了,找他的团队还不少 介绍一个 like rails 的 rust 框架。 性能和开发速度都快。 除了写小工具外再也不想用 Rust 了 rust 我想你了 rust 程序员的硬盘是多大的? nodejs 继任者? rust 练手写的,仿 uv 包管理器 av Rust 的安全神话?为何在关键系统如数据库、大模型代码中仍选 C++ rust 实现的抓包存盘的程序 nsave
太快了! Rust 太快了!
cKnight · 2025-09-18 · via Rust

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%