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 控制 + 环境校准,避免“第一次跑慢、第二次快”这类常见幻觉。尤其适合测 ConcurrentDictionaryChannelParallel.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),必须加锁或改用 ConcurrentQueue,否则结果不可比

对比测试: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;
[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 内存,把吞吐直接砍半。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

173

2023.11.23

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

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

92

2025.11.27

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

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

471

2023.08.10

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

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

107

2025.12.24

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

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

130

2025.07.29

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

239

2025.11.14

golang channel相关教程
golang channel相关教程

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

320

2025.11.17

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

1

2025.12.31

热门下载

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

精品课程

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

共58课时 | 3.1万人学习

Pandas 教程
Pandas 教程

共15课时 | 0.9万人学习

ASP 教程
ASP 教程

共34课时 | 3万人学习

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

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