V2EX 09月18日
Java与Rust Web开发性能对比:资源占用与压测分析
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文作者作为一名Java开发者,在周末尝试使用Rust编写了一个Web项目,并将其与Java的SpringMVC架构进行了对比。在资源占用方面,Rust项目仅占用2.0MB内存,而Java项目则占用494.2MB。在压测环节,尽管双方吞吐量和异常率持平,Rust在平均响应时间、最大响应时间和99%百分位响应时间上均表现更优,且数据包大小更小,显示出Rust在Web服务开发中的潜在性能优势。

🦀 **资源占用差异显著**:在同一Mac笔记本上测试,Rust项目启动后内存占用仅为2.0MB,而Java项目(使用Idea启动,未打包jar)在配置-Xms256m -Xmx4g的情况下,内存占用高达494.2MB,显示出Rust在内存效率上的巨大优势。

🚀 **压测表现Rust更优**:在模拟的业务场景压测中,Rust在平均响应时间(3-4ms vs 6-8ms)、最大响应时间(17ms vs 26ms)以及99%百分位响应时间(11-15ms vs 15-20ms)上均优于Java,响应速度更快。

📊 **吞吐量与稳定性持平**:尽管性能指标有差异,Rust和Java在压测中的吞吐量(6.7-10.0 req/sec)和异常率(0%)表现一致,均能稳定处理高并发请求,表明两者在基础功能实现上都达到了生产级水平。

📦 **数据包大小Rust更小**:Rust产生的网络数据包大小为294B,而Java为489B,前者比后者增加了66%,这在网络传输效率上是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: 线程组-30Number of Threads: 200Ramp-Up Period: 30 Loop Count: 1Scheduler:  Duration: 90Name: 线程组-90Number of Threads: 200Ramp-Up Period: 30   Loop Count: 1Scheduler:  Startup Delay: 90  Duration: 90

压测流程如下

阶段一:0~30 秒启动 200 线程 → 持续到第 90 秒阶段二:从第 90 秒开始,30 秒内启动 300 线程 → 持续到第 180 秒

压测结果对比如下

指标RUSTJAVA差异
平均响应时间3~4 ms6~8 ms↑ 上升 50%~100%
最大响应时间17 ms26 ms↑ 上升 53%
99% 百分位11~15 ms15~20 ms↑ 上升 30%~45%
吞吐量6.7 → 10.0 req/sec6.7 → 10.0 req/sec✅ 相同
异常率0%0%✅ 相同
数据包大小294 B489 B↑ 增加 66%

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Rust Java Web开发 性能对比 资源占用 压测 Axum SpringMVC 性能优化
相关文章