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%百分位响应时间上均表现更优,平均响应时间快50%-100%,最大响应时间提升53%,99%百分位提升30%-45%。尽管吞吐量和异常率相当,Rust在数据包大小上也更小。该对比展示了Rust在Web开发中的显著性能优势。

✨ 资源占用对比悬殊:Rust Web项目内存占用极低,仅为2.0MB,而Java项目高达494.2MB,显示出Rust在资源效率上的巨大优势,尤其适合资源受限或需要高密度部署的场景。

🚀 响应时间性能显著提升:在模拟真实业务场景的压测中,Rust项目的平均响应时间比Java快50%-100%,最大响应时间提升53%,99%百分位响应时间提升30%-45%,表明Rust在处理高并发请求时具有更快的处理速度和更低的延迟。

📊 吞吐量与稳定性相当:尽管性能指标有显著差异,Rust和Java项目在压测中均实现了相同的吞吐量(6.7-10.0 req/sec)和0%的异常率,说明两者在稳定性和处理能力上均能满足需求,但Rust以更低的资源消耗和响应时间达成。

📦 数据包大小优化:Rust项目的数据包大小为294B,相比Java项目的489B,体积减少了66%。更小的数据包意味着更低的网络传输开销和更快的传输速度,进一步提升了整体的网络性能。

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 资源占用 压测 响应时间 吞吐量
相关文章