9.Rust+Axum 测试驱动开发与性能优化全攻略
摘要
本文深入讲解 Rust+Axum 测试驱动开发及性能优化,涵盖多种测试工具与优化技术。
一、引言
在当今的软件开发领域,测试驱动开发(TDD)和性能优化是保障软件质量和性能的关键环节。Rust 作为一种安全、高效的系统编程语言,与 Axum 这个轻量级且高性能的 Web 框架相结合,为开发者提供了强大的工具。本文将详细介绍在 Rust+Axum 项目中如何进行测试驱动开发以及性能优化,包括单元测试和集成测试框架的搭建、使用 wrk 和 oha 工具进行 Benchmark 性能压测,以及零拷贝优化和内存泄漏检测等内容。
二、单元测试/集成测试框架搭建
2.1 单元测试
在 Rust 中,单元测试是内置于语言本身的。对于 Axum 项目,我们可以使用 Rust 的 #[test]
属性来编写单元测试。以下是一个简单的 Axum 处理函数的单元测试示例:
use axum::{routing::get, Router};
use http::Request;
use tower::ServiceExt;async fn hello_world() -> &'static str {"Hello, world!"
}#[tokio::test]
async fn test_hello_world() {let app = Router::new().route("/", get(hello_world));let response = app.oneshot(Request::builder().uri("/").body(hyper::Body::empty()).unwrap()).await.unwrap();assert_eq!(response.status(), 200);let body = hyper::body::to_bytes(response.into_body()).await.unwrap();assert_eq!(body, "Hello, world!");
}
在这个示例中,我们创建了一个简单的 Axum 路由,并编写了一个单元测试来验证该路由的响应是否符合预期。
2.2 集成测试
集成测试用于测试多个组件之间的交互。在 Axum 项目中,我们可以使用 axum_test
库来进行集成测试。以下是一个集成测试的示例:
use axum::{routing::get, Router};
use axum_test::TestServer;async fn hello_world() -> &'static str {"Hello, world!"
}#[tokio::test]
async fn test_integration() {let app = Router::new().route("/", get(hello_world));let server = TestServer::new(app).unwrap();let response = server.get("/").await;assert_eq!(response.status(), 200);let body = response.text().await;assert_eq!(body, "Hello, world!");
}
axum_test
库提供了一个 TestServer
结构体,用于模拟 Axum 服务器,方便进行集成测试。
三、Benchmark 性能压测(wrk/oha 工具)
3.1 wrk 工具
wrk 是一个常用的 HTTP 性能测试工具。首先,我们需要安装 wrk。在安装完成后,我们可以使用以下命令对 Axum 应用进行性能压测:
wrk -t12 -c400 -d30s <http://localhost:3000>
其中,-t
表示线程数,-c
表示并发连接数,-d
表示测试持续时间。运行该命令后,wrk 会输出一系列性能指标,如请求吞吐量、响应时间等。
3.2 oha 工具
oha 是一个用 Rust 编写的 HTTP 性能测试工具,具有简洁易用的特点。使用 oha 对 Axum 应用进行性能压测的命令如下:
oha -z 30s <http://localhost:3000>
z
表示测试持续时间。oha 会输出详细的性能报告,包括请求成功率、平均响应时间等。
四、零拷贝优化与内存泄漏检测
4.1 零拷贝优化
零拷贝是一种优化数据传输的技术,它可以减少数据在用户空间和内核空间之间的拷贝次数,从而提高性能。在 Rust+Axum 中,我们可以使用 tokio::io::copy
函数来实现零拷贝。以下是一个简单的示例:
use axum::{routing::get, Router};
use hyper::Body;
use tokio::fs::File;async fn serve_file() -> Result<Body, std::io::Error> {let file = File::open("example.txt").await?;let body = Body::wrap_stream(tokio_util::io::ReaderStream::new(file));Ok(body)
}#[tokio::main]
async fn main() {let app = Router::new().route("/file", get(serve_file));axum::Server::bind(&"127.0.0.1:3000".parse().unwrap()).serve(app.into_make_service()).await.unwrap();
}
在这个示例中,我们使用 tokio::fs::File
打开文件,并使用 tokio_util::io::ReaderStream
将文件内容直接转换为 hyper::Body
,避免了数据的多次拷贝。
4.2 内存泄漏检测
在 Rust 中,内存泄漏是比较少见的,但在复杂的应用中仍然可能发生。我们可以使用 valgrind
工具来检测内存泄漏。首先,我们需要在项目中添加 #[global_allocator]
来使用 valgrind
支持的内存分配器:
#[global_allocator]
static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
然后,使用以下命令运行应用并进行内存泄漏检测:
valgrind --leak-check=full --show-leak-kinds=all ./your_app
valgrind
会输出详细的内存泄漏信息,帮助我们定位和解决问题。
五、总结
通过本文的介绍,我们了解了在 Rust+Axum 项目中如何进行测试驱动开发和性能优化。合理搭建单元测试和集成测试框架可以保证代码的正确性和稳定性,使用 wrk 和 oha 工具进行性能压测可以帮助我们发现性能瓶颈,而零拷贝优化和内存泄漏检测则可以进一步提升应用的性能和可靠性。在实际开发中,我们应该充分利用这些技术和工具,不断优化我们的 Rust+Axum 应用。
相关文章:
9.Rust+Axum 测试驱动开发与性能优化全攻略
摘要 本文深入讲解 RustAxum 测试驱动开发及性能优化,涵盖多种测试工具与优化技术。 一、引言 在当今的软件开发领域,测试驱动开发(TDD)和性能优化是保障软件质量和性能的关键环节。Rust 作为一种安全、高效的系统编程语言&…...
中国首个全国34省3,667个城市多属性建筑数据集(屋顶、高度、结构、功能、风格、年龄、质量等属性)
中国首个全国34省3,667个城市多属性建筑数据集(屋顶、高度、结构、功能、风格、年龄、质量等属性) 数据介绍 快速获取三维(3D)建筑数据,包括屋顶、高度和方向等几何属性,以及功能、质量和年龄等指示性属性…...
探索Spring Boot Web模块:设计思想与技术实现
探索Spring Boot Web模块:设计思想与技术实现 在现代Web开发中,Spring Boot作为一个强大的框架,提供了丰富的功能来简化Web应用的开发。本文将深入探讨Spring Boot框架中Web模块的核心类,揭示其设计思想、技术实现以及扩展知识。…...
GitHub创建远程仓库
使用GitHub创建远程仓库:从零开始实现代码托管与协作 前言 在当今软件开发领域,版本控制系统已成为开发者必备的核心工具。作为分布式版本控制系统的代表,Git凭借其强大的分支管理和高效的协作能力,已成为行业标准。而GitHub作为…...
PLM系统如何支持利益相关者分析?沟通矩阵设计
PLM(产品生命周期管理)系统在现代企业的产品研发与管理过程中扮演着至关重要的角色。它不仅仅是一个管理产品数据的工具,更能在利益相关者分析以及沟通矩阵设计方面提供强大的支持。通过合理运用PLM系统,企业能够更好地识别、理解…...
每日一题(8) 求解矩阵最小路径和问题
给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。求所有路径和中最小路径和。 输入格式: 首先输入行数m及列数n,接下来输入m行,每…...
JAVA设计模式:注解+模板+接口
1.基础组件 1.1注解类控制代码执行启动、停止、顺序 /*** author : test* description : 数据同步注解* date : 2025/4/18*/ Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface SyncMeta {/*** 执行服务名称* return*/String name…...
如何在Linux系统中部署C++ Web应用
在 Linux 上部署 C Web 应用,和部署传统的 PHP 或 Node.js 应用相比更“原生”一些,通常涉及到自己编译、配置 Web 服务、处理依赖等。本文将详细讲解部署一个基于 C 编写的 Web 应用的完整流程,涵盖从构建、部署、到上线的每一步,…...
实用工具-screenrec介绍(截图工具)
官方地址:Communicate Faster with Instant Video Messages & Screenshots 官方下载安装包,安装完成后,默认快捷键 alt s 开启截图,录屏 介绍 ScreenRec 是一款免费无广告的屏幕录制与截图工具,支持多平台&…...
使用veaury,在vue项目中运行react组件
网上的信息太少了,记录一下 我的项目是vue3webpack 使用:veaury Veaury 是基于React和Vue3的工具库,主要用于React和Vue在一个项目中公共使用的场景,主要运用在项目迁移、技术栈融合的开发模式、跨技术栈使用第三方组件的场景。 参…...
开源 vs. 闭源:大模型的未来竞争格局
开源 vs. 闭源:大模型的未来竞争格局 引言 在人工智能领域,尤其是大型语言模型(LLM)的发展中,开源与闭源之争已成为决定行业未来走向的关键议题。随着ChatGPT的横空出世和开源模型的蓬勃发展,技术社区正经历着一场深刻的范式转变…...
pcl代码解析
一、库基础代码解析: PCL库基础:点云类型与算法详解-CSDN博客 主要介绍PCL库的一些基本的点云类型、相关数据类型以及ROS接口消息,和一些常用的算法。 用到的一些PCL点云类型 pcl::PointXYZ: 这是最简单也可能是最常用到的点类型;它只储存…...
中华传承-医山命相卜-梅花易数
梅花易数 灵活起卦(如数字、声音、外应等)和象数结合,准确率可达96.8%。其起卦方式摆脱传统龟壳、蓍草的繁琐,强调直觉与灵活性。 个人决策、事件预测等 尤其在短期、具体问题上表现突出。...
HOOPS Exchange 与HOOPS Communicator集成:打造工业3D可视化新标杆!
一、概述 在工业3D开发、BIM建筑、数字孪生和仿真分析等高端应用场景中,数据格式复杂、模型体量庞大、实时交互体验要求高,一直是困扰开发者的难题。Tech Soft 3D旗下的HOOPS Exchange和HOOPS Communicator,正是解决这类问题的黄金搭档。二者…...
SQL预编译——预编译真的能完美防御SQL注入吗
SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中,程序本身 未对插入的SQL语句进行过滤,导致SQL语句直接被服务端执行。 拼接的SQL查询例如,通过在id变量后插入or 11这样的条件,来绕过身份验证&#…...
通过 Zotero 的样式编辑器(Style Editor)自定义文献引用和参考文献列表的格式
好的!以下是一个更为详细的教程,帮助你通过 Zotero 的样式编辑器(Style Editor)自定义文献引用和参考文献列表的格式。 详细教程:使用 Zotero 样式编辑器自定义文献格式 1. 准备工作 在开始之前,请确保&a…...
PostgreSQL 通过 copy 命令导入几何数据 及 通过 CopyManager.copyIn() 导入几何数据
COPY命令介绍 copy是postgresql提供的一个专门用于快速导入导出数据的命令,通常用于从文件(TXT、CSV等)或标准输入输出中读取或写入数据。适合批量导入导出数据,速度快。 默认情况下,如果在处理过程中遇到错误,COPY将失败。 COPY只能用于表,不能用于视图!!! COPY…...
Next.js 技术详解:构建现代化 Web 应用的全栈框架
1. Next.js 概述 Next.js 是一个基于 React 的全栈框架,由 Vercel 团队开发和维护。它提供了一系列开箱即用的功能,使开发者能够快速构建高性能的 Web 应用。 核心优势 服务端渲染 (SSR)静态站点生成 (SSG)增量静态再生成 (ISR)文件系统路由API 路由图…...
【unity实战】Unity动画层级(Animation Layer)的Sync同步和Timing定时参数使用介绍,同步动画层制作角色的受伤状态
文章目录 前言方案一:复制粘贴原有层级的状态机1、实现2、问题 方法二:勾选Sync同步动画层1、简单实现同步2、同步blend tree的问题3、动画状态的播放时长4、下层状态覆盖了上层状态 专栏推荐完结 前言 如何制作角色的受伤状态? 玩家角色在…...
NFC 碰一碰发视频源码搭建,碰一碰发视频定制化开发技术
在移动互联时代,便捷的数据传输方式备受青睐。NFC(近场通信)技术以其操作简单、连接迅速的特性,为设备间的数据交互提供了高效解决方案。通过搭建 NFC 碰一碰发视频功能,用户只需将支持 NFC 的设备轻轻靠近,…...
获取视频封面
目录 实现方式注意事项代码实现 实现方式 通过 video 元素canvas 元素的方式实现 生成 video 和 canvas 元素当 video 元素资源加载完成时,将 video 元素绘制到 canvas 画布上,然后通过 toBlob 或则 toDataURL 获取到对应的封面图片资源 注意事项 vid…...
c#开发大冲锋游戏登录器
1 前言 本文主要分享登录器的简要开发过程,只适合小白选手,高手请自动避让。 此项目是复刻大冲锋计划中的子集。 (注:大冲锋是迅雷代理的一款次时代多职业第一人称FPS射击游戏,目前已经关服嗝屁。) 2 …...
堆的实现以及利用堆进行排序
堆 堆的实现1. 什么是堆?2. 最小堆的核心操作2.1 初始化堆2.2 销毁堆2.3 插入元素2.4 删除堆顶元素2.5 获取堆顶元素2.6 判断堆是否为空 3. 调整堆的算法3.1 向上调整3.2 向下调整 4. 测试代码 堆排序一.向下调整建堆二.向上调整建堆 时间复杂度分析向上建堆分析&am…...
FPGA-VGA
目录 前言 一、VGA是什么? 二、物理接口 三、VGA显示原理 四、VGA时序标准 五、VGA显示参数 六、模块设计 七、波形图设计 八、彩条波形数据 前言 VGA的FPGA驱动 一、VGA是什么? VGA(Video Graphics Array)是IBM于1987年推出的…...
仿腾讯会议项目开发——界面关闭功能实现
目录 1、include(./netapi/netapi.pri) 2、加快构建速度 3、INCLUDEPATH./netapi 4、添加控制类 5、用单例模式创建一个Ckernel的对象 6、创建一个回收的槽函数 7、添加界面文件 8、创建一个私有的界面对象 9、修改为使用单例模式的控制类创建界面 10、在Ckernel类中…...
微信小程序怎么分包步骤(包括怎么主包跳转到分包)
第一步 主包跳转到分包 第一步 第二步...
点云配准控制迭代停止的阈值
在点云配准(如ICP算法)中,setEuclideanFitnessEpsilon() 是一个设置收敛条件的函数,用于控制迭代停止的阈值。以下是关于该参数的详细说明: 函数作用 setEuclideanFitnessEpsilon() 设置的是 两次连续迭代之间均方误…...
高频面试题:Android MVP/MVVM/MVI这几种架构在实际生产中,各自的优缺点和适用场景是什么
安卓开发早期的架构模式相对简单,许多开发者直接在Activity或Fragment中堆砌业务逻辑和UI操作,这种方式虽然在小型项目中看似高效,但随着代码量的增加,很快就会导致逻辑混乱、难以测试和维护的问题。Activity和Fragment作为安卓框…...
国内主要半导体厂家
以下是国内主要半导体厂家按产品类别(模拟、数字、MCU、功率、传感器等)的分类总结,涵盖各领域代表企业及其核心产品方向: 一、模拟芯片(Analog IC) 圣邦微电子(SGMICRO)…...
DeepSeek深度观察:白宫“炒人“威胁的语义强度与市场应激量化分析
一、AI观察:政治博弈的语义强度分析 通过NLP情感分析模型对特朗普近期公开言论的语义解析显示,总统在社交媒体及记者会中多次使用"立即解雇""卷铺盖走人"等极端表述,其公开威胁解雇鲍威尔的推文互动量突破120万次&#…...
城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 城市街拍暗色电影胶片风格 Lr 调色,是借助 Adobe Lightroom 软件,为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感,营造出充满故事感与艺术感的暗色氛围,让照片仿佛截取于某部充满张力…...
图像分类标注小工具
图像分类标注小工具 不说废话 上代码 import os import cv2 import shutil import csvclass ImageLabeler:def __init__(self, input_dir, output_dir, class_names, csv_pathlabel_log.csv, preview_size(800, 800)):self.input_dir input_dirself.output_dir output_dirse…...
leetcode 2364. 统计坏数对的数目 中等
给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] ,那么我们称 (i, j) 是一个 坏数对 。 请你返回 nums 中 坏数对 的总数目。 示例 1: 输入:nums [4,1,3,3] 输出:5 解释:数对…...
网络互连与互联网3
1.SMTP简单邮件传输协议,用于发送电子邮件,默认情况下是明文传输,没有加密机制。 SSL是一种安全协议,对电子邮件进行加密传输。 POP3主要用于接收电子邮件 IMAP用于接收电子邮件 2.采用存储-转发方式处理信号的设备是交换机 …...
docker部署springboot(eureka server)项目
打jar包 使用maven: <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>17</source><target>17&…...
git 出现 port 443 Connection timed out
梯子正常延迟不算严重,但在使用git push时反复出现 fatal: unable to access https://github.com/irvingwu5/xxxx.git/ Error in the HTTP2 framing layer Failed to connect to github.com port 443 after 136353 ms: Connection timed out 将git的网络配置与梯子…...
深入 MySQL 高级查询:JOIN、子查询与窗口函数的实用指南
在数据管理和分析的过程中,MySQL 提供了强大的查询功能,特别是在处理复杂数据关系时。本文将深入探讨 MySQL 的三种高级查询技术:JOIN、子查询和窗口函数。通过对这些技术的详细讲解和示例,帮助您更好地掌握并应用这些查询技巧。 …...
AXOP36061S: 60V 高压单通道运算放大器
AXOP36061S 是一款通用型高压带关断功能的单通道运算放大器,工作电压为3V至60V,具有17MHz的带宽和 15V/μs的压摆率,静态电流2.2mA,关断电流80μA,高耐压和宽带宽使其可以胜任绝大多数的高压应用场景。得益于对噪声和T…...
Aladdin显卡多任务运行教程
Aladdin显卡多任务运行 任务场景操作步骤其他说明 任务场景 当我运行我的代码后发现80G的显存仅占用了46G左右,还有很大空间没有被使用,于是想着能不能把剩下的空间也利用起来,于是有了接下来的工作。 操作步骤 当我们使用GPU run/debug/…...
Oracle AWR快照保留策略及其修改
文章目录 一、AWR快照保留机制及其修改方法二、生产环境建议三、监控建议 一、AWR快照保留机制及其修改方法 默认保留策略: • 标准保留期:8天 • 快照间隔:每小时1次(默认) • 存储位置:SYSAUX表空间 保留…...
日本公司如何实现B2B商城订货系统的自动化和个性化?
在日本构建具备前后台日文本地化、业务员代客下单、一客一价、智能拆单发货的B2B电商系统,需结合日本商业习惯与技术实现。以下是关键模块的落地方案: 一、系统架构设计 1. 前端本地化 语言与UI适配 采用全日语界面,包含敬语体系(…...
JavaScript 核心特性完全指南
引言 JavaScript 已经不再只是浏览器中的脚本语言,它支撑着前端、后端(Node.js)、桌面(Electron)、移动端(React Native)等多种生态。要在现代 Web 开发中游刃有余,除了会写代码,更要深刻理解语言特性、掌握常见模式和优化技巧。下面逐一深入解析 20 大核心特性。 1.…...
CentOS系统中排查进程异常终止的日志
在CentOS系统中排查进程异常终止的日志,可通过以下步骤结合多类日志文件和工具进行综合分析: 一、核心日志文件排查 系统全局日志 查看 /var/log/messages:记录系统级错误、内核消息及进程异常终止信息,如OOM Killer事件。…...
Vue组件安全工程的量子跃迁:从基因改造到生态免疫
总章数字生命的进化论 2023年某电商平台红蓝对抗中,一个未净化的v-html指令导致千万用户数据泄露。当我们剖开现代Web应用的器官式架构,发现90%的安全漏洞都源自组件间的信任危机。本文将带您见证如何用军工级防御体系重构Vue组件,使其具备类…...
编程技能:调试03,逐过程命令与退出调试
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:调试02,设置断点与删除断点 回…...
基于Ubuntu22.04和OpenCV4.5.4的物联网人脸识别考勤机
前言:本人已有Ubuntu22.04的相关开发环境配置,并且默认C和机器学习基础,这里直接从安装opencv开始,完整代码在最后。具体情况具体分析,请以实际为主。 视频参考:【大厂敲门砖】从0到1做一个物联网人脸识别…...
java 排序算法-快速排序
快速排序(Quick Sort)是一种高效的排序算法,它使用分治法(Divide and Conquer)策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。 快速排序算法的基本思想: 选择基准值&…...
openEuler系统下源码编译安装Nginx实践教程
openEuler 24.03 LTS 源码编译安装Nginx实践教程 前言一、环境准备1. 系统要求2. 更新系统与基础配置二、依赖安装1. 安装编译工具链2. 安装Nginx核心依赖三、源码编译安装1. 下载Nginx源码2. 创建专用系统用户3. 配置编译参数4. 编译与安装四、服务配置与管理1. 创建Systemd服…...
helloword 1(安卓逆向工具简单利用)
题目 做法 下载,不要解压,直接拖入Exeinfo PE进行分析 文件后缀是apk,判断为安卓逆向题 拖进ApkIDE 先找主函数main函数,这题的flag直接出来了 (搜索内容不要习惯性空格之类,这样会找不出来)…...
基于ONT数据的乳腺癌BRCA1和BRCA2变异检测方法
评估 BRCA1/2 分子状态已成为乳腺癌患者治疗的标准操作。例如聚合酶抑制剂(PARPi)的开发和临床应用,PARPi 是肿瘤学家新疗法中的关键方式。已发现 PARPi 可改善携带 BRCA1/2 种系或体细胞突变的乳腺癌患者的临床结局,提高患者生存率和生活质量。因此,目前全球指南强烈建议…...