Criterion.rs 中限制基准测试线程数的技术方案
2025-06-10 17:01:55作者:魏献源Searcher
背景介绍
在进行性能基准测试时,合理控制资源使用是一个常见需求。Criterion.rs 作为 Rust 生态中广泛使用的基准测试框架,默认会利用系统的所有可用线程来执行测试,这在某些场景下可能并不理想,特别是在共享服务器环境中需要限制资源使用的情况下。
问题分析
当在服务器环境中运行基准测试时,我们经常需要控制测试使用的计算资源,以避免影响其他服务或进程。Criterion.rs 底层使用了 Rayon 线程池来并行执行测试,默认情况下会使用系统所有可用的 CPU 核心。
解决方案
通过集成 Rayon 的线程池配置功能,我们可以在 Criterion.rs 基准测试中限制使用的线程数量。以下是具体实现方法:
fn set_thread_pool(c: &mut Criterion) {
static ONCE: Once = Once::new();
ONCE.call_once(||
rayon::ThreadPoolBuilder::new().num_threads(4).build().unwrap()
);
}
criterion_group!(benches, set_thread_pool, ...)
技术要点解析
-
Once 同步原语:使用
std::sync::Once确保线程池只初始化一次,避免重复创建带来的性能开销。 -
Rayon 线程池配置:通过
rayon::ThreadPoolBuilder可以自定义线程池参数,其中num_threads(4)将线程数限制为 4 个。 -
Criterion 集成:将初始化函数作为基准测试组的第一个参数,确保在所有测试运行前完成线程池配置。
进阶讨论
线程数选择策略
- CPU 密集型任务:通常设置为物理核心数的 1-2 倍
- I/O 密集型任务:可以适当增加线程数以重叠 I/O 等待时间
- 共享环境:建议保留部分核心给系统和其他服务
其他配置选项
Rayon 的 ThreadPoolBuilder 还提供了其他有用的配置项:
rayon::ThreadPoolBuilder::new()
.num_threads(4)
.stack_size(2 * 1024 * 1024) // 设置线程栈大小
.build()
.unwrap();
注意事项
- 线程池配置必须在所有并行操作开始前完成
- 过多的线程可能导致上下文切换开销增加
- 在容器化环境中要考虑 CPU 限制的配合设置
结论
通过合理配置 Rayon 线程池,我们可以在 Criterion.rs 基准测试中精确控制使用的线程资源,这对于生产环境中的性能测试尤为重要。这种技术不仅适用于服务器资源限制场景,也可用于测试不同线程配置下的性能表现,是多线程程序调优的有力工具。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0148- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
auto-devAutoDev 是一个 AI 驱动的辅助编程插件。AutoDev 支持一键生成测试、代码、提交信息等,还能够与您的需求管理系统(例如Jira、Trello、Github Issue 等)直接对接。 在IDE 中,您只需简单点击,AutoDev 会根据您的需求自动为您生成代码。Kotlin03
Intern-S2-PreviewIntern-S2-Preview,这是一款高效的350亿参数科学多模态基础模型。除了常规的参数与数据规模扩展外,Intern-S2-Preview探索了任务扩展:通过提升科学任务的难度、多样性与覆盖范围,进一步释放模型能力。Python00
skillhubopenJiuwen 生态的 Skill 托管与分发开源方案,支持自建与可选 ClawHub 兼容。Python0111
项目优选
收起
暂无描述
Dockerfile
731
4.73 K
Ascend Extension for PyTorch
Python
609
786
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1 K
1.01 K
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
433
392
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
145
237
Claude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed.
Get Started
Rust
1.15 K
148
暂无简介
Dart
983
250
Oohos_react_native
React Native鸿蒙化仓库
C++
347
401
昇腾LLM分布式训练框架
Python
166
197
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.67 K
985