0

0

c# 如何测试代码的并发性能 c#性能测试工具

星降

星降

发布时间:2026-01-01 11:19:02

|

708人浏览过

|

来源于php中文网

原创

benchmarkdotnet 是 c# 并发吞吐量测试最靠谱方案,支持自动预热、多线程压测、gc 控制与延迟分布统计,需用 [concurrencylevel]、[memorydiagnoser] 等特性正确配置。

c# 如何测试代码的并发性能 c#性能测试工具

BenchmarkDotNet 测并发吞吐量最靠谱

直接上结论:C# 里测并发性能,别手写 Task.Run + Stopwatch,也别用老旧的 Visual Studio Diagnostic Tools 抓毛刺——BenchmarkDotNet 是目前唯一能稳定复现、隔离干扰、自动预热、支持多线程/多进程并发模式的工业级方案。

它底层用 RyuJIT 预热 + 多轮采样 + GC 控制 + 环境校准,避免“第一次跑慢、第二次快”这类常见幻觉。尤其适合测 ConcurrentDictionaryChannel<t></t>Parallel.ForEachAsync 这类高并发组件的真实吞吐(如 ops/sec)和延迟分布(P95/P99)。

  • 安装:dotnet add package BenchmarkDotNet
  • 必须标记 [MemoryDiagnoser][ConcurrencyLevel(4)] 才能开启并发压力模式
  • 方法签名必须是 public void MethodName(),不能带参数或返回值
  • 避免在基准方法里做 I/O、随机数、DateTime.Now —— 这些会污染统计

BenchmarkDotNet 并发配置关键参数

默认是单线程串行跑,要真正压出并发瓶颈,得显式控制线程数、是否共享状态、是否允许 GC 干扰:

  • [ConcurrencyLevel(8)]:指定最多 8 个线程并发调用该方法(不是 CPU 核心数,是逻辑并发度)
  • [InvocationCount(1000)]:每个线程执行 1000 次,总调用数 = 线程数 × 次数
  • [DryJob] / [MediumRun]:开发期用 DryJob 快速验证,压测用 MediumRun(约 25 秒)保证数据稳定
  • 若被测方法操作共享对象(如静态 List<t></t>),必须加锁或改用 ConcurrentQueue<t></t>,否则结果不可比

对比测试:lock vs SpinLock vs Interlocked

测并发性能最常踩的坑,是拿错标尺——比如只比单次加锁耗时,却忽略争用率。下面这个例子会真实暴露高争用下三者的差异:

[MemoryDiagnoser]
[ConcurrencyLevel(16)]
public class LockBenchmarks
{
    private readonly object _objLock = new();
    private readonly SpinLock _spinLock = new();
    private int _counter = 0;
<pre class='brush:php;toolbar:false;'>[Benchmark]
public void WithLock()
{
    lock (_objLock) Interlocked.Increment(ref _counter);
}

[Benchmark]
public void WithSpinLock()
{
    bool taken = false;
    try
    {
        _spinLock.Enter(ref taken);
        Interlocked.Increment(ref _counter);
    }
    finally
    {
        if (taken) _spinLock.Exit();
    }
}

[Benchmark]
public void WithInterlocked()
{
    Interlocked.Increment(ref _counter);
}

}

青鸟内测(手机app封装、托管系统)
青鸟内测(手机app封装、托管系统)

注意:请在linux环境下测试或生产使用 青鸟内测是一个移动应用分发系统,支持安卓苹果应用上传与下载,并且还能快捷封装网址为应用。应用内测分发:一键上传APP应用包,自动生成下载链接和二维码,方便用户内测下载。应用封装:一键即可生成app,无需写代码,可视化编辑、 直接拖拽组件制作页面的高效平台。工具箱:安卓证书生成、提取UDID、Plist文件在线制作、IOS封装、APP图标在线制作APP分发:

下载

注意:这里 _counter 是实例字段,每个线程操作的是同一份内存地址,才能触发真实争用。如果误写成局部变量,所有结果都会接近 Interlocked,毫无参考价值。

避开 Stopwatch 手动计时的典型陷阱

有人用 Stopwatch.Start() → Task.WhenAll(...) → Stopwatch.Stop() 测并发,结果偏差极大,原因很实在:

  • Stopwatch 测的是“任务发起到全部结束”的墙钟时间,不是实际工作耗时(中间大量线程挂起、调度延迟全算进去了)
  • 没控制 GC 触发时机,一次 Gen2 就让整轮结果偏移 50ms+
  • 没排除 JIT 编译开销——首次调用方法永远最慢,而 BenchmarkDotNet 会自动预热 3 轮以上
  • 没处理异步方法的 await 上下文捕获开销,尤其在 UI 线程或 AspNetCore 同步上下文中会放大延迟

真要临时测,至少用 Environment.ProcessorCount 控制并发数,并在 Task.Run 内部用 Stopwatch 测单次执行,再取平均——但这仍不如 BenchmarkDotNetMean + StdDev 统计可靠。

并发性能不是看峰值吞吐,而是看 P99 延迟是否稳定、GC 是否频繁、CPU 是否打满还卡顿。这些指标 BenchmarkDotNet 默认输出,但容易被忽略——尤其 Allocated 列,一个没注意的闭包捕获,就能让每秒分配几 MB 内存,把吞吐直接砍半。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

186

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

134

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

765

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

377

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

31

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

29

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

103

2026.02.06

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

151

2025.07.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.2万人学习

ASP 教程
ASP 教程

共34课时 | 5.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号