使用 BenchmarkDotNet 比较指定容量的 List 的性能

我们之前提到 List 是 .NET 中常用的数据结构,其在存储大量数据时,如果能够指定它的初始化容量,就会有性能提升。这个优化的方法并不是很明显,因此本文将使用 BenchmarkDotNet 库,通过定量对比的方式来证明这一点。

实验过程

引入 BenchmarkDotNet

首先,我们需要在项目中引入 BenchmarkDotNet 库。这可以通过在项目的 NuGet 包管理器中搜索并安装 BenchmarkDotNet 来实现。

指定需要测试的方法和参数

接下来,我们需要指定需要测试的方法和参数。这可以通过在代码中使用 [Benchmark] 属性来实现。例如,我们可以在测试类中定义两个测试方法,一个使用指定容量的 List,一个使用未指定容量的 List。

public class ListBenchmark
{[Benchmark]public void ListWithCapacity(){var list = new List<int>(1000000);for (int i = 0; i < 1000000; i++){list.Add(i);}}[Benchmark]public void ListWithoutCapacity(){var list = new List<int>();for (int i = 0; i < 1000000; i++){list.Add(i);}}
}

我们还可以使用其他参数来指定测试的一些细节,如使用的 .NET 框架版本,是否进行内存测量等。

[SimpleJob(RuntimeMoniker.Net70)]
[SimpleJob(RuntimeMoniker.NetCoreApp31)]
[MemoryDiagnoser]
public class ListBenchmark
{[Benchmark]public void ListWithCapacity(){var list = new List<int>(1000000);for (int i = 0; i < 1000000; i++){list.Add(i);}}[Benchmark]public void ListWithoutCapacity(){var list = new List<int>();for (int i = 0; i < 1000000; i++){list.Add(i);}}
}

运行测试

最后,我们可以使用 BenchmarkRunner 类来运行测试。这可以通过在 Main 方法中调用 BenchmarkRunner.Run<T>() 方法来实现。其中 T 是包含测试方法的类的类型。

class Program
{static void Main(string[] args){BenchmarkRunner.Run<ListBenchmark>();}
}

实验结果

运行测试后,我们可以得到若干个指标的测试结果。这些指标可能包括运行时间、内存使用量等。通过对比这些指标,我们可以得出结论:使用指定容量的 List 性能优于未指定容量的 List。

例如,我们可以看到,使用指定容量的 List 的平均运行时间要比未指定容量的 List 少得多,内存使用量也更少。

// * Summary *BenchmarkDotNet=v0.13.2, OS=Windows 11 (10.0.22000.1335/21H2)
12th Gen Intel Core i7-12700, 1 CPU, 20 logical and 12 physical cores
.NET SDK=7.0.101
[Host]        : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
.NET 7.0      : .NET 7.0.1 (7.0.122.56804), X64 RyuJIT AVX2
.NET Core 3.1 : .NET Core 3.1.32 (CoreCLR 4.700.22.55902, CoreFX 4.700.22.56512), X64 RyuJIT AVX2|              Method |           Job |       Runtime |     Mean |     Error |    StdDev |     Gen0 |     Gen1 |     Gen2 | Allocated |
|-------------------- |-------------- |-------------- |---------:|----------:|----------:|---------:|---------:|---------:|----------:|
|    ListWithCapacity |      .NET 7.0 |      .NET 7.0 | 1.392 ms | 0.0302 ms | 0.0891 ms | 164.0625 | 164.0625 | 164.0625 |   3.81 MB |
| ListWithoutCapacity |      .NET 7.0 |      .NET 7.0 | 2.602 ms | 0.0503 ms | 0.0559 ms | 507.8125 | 500.0000 | 500.0000 |      8 MB |
|    ListWithCapacity | .NET Core 3.1 | .NET Core 3.1 | 1.168 ms | 0.0227 ms | 0.0278 ms | 218.7500 | 218.7500 | 218.7500 |   3.81 MB |
| ListWithoutCapacity | .NET Core 3.1 | .NET Core 3.1 | 2.652 ms | 0.0520 ms | 0.0461 ms | 507.8125 | 500.0000 | 500.0000 |      8 MB |

总结

本文通过 BenchmarkDotNet 库,使用定量对比的方式,证明了使用指定容量的 List 性能优于未指定容量的 List。这是因为指定容量的 List 在初始化时,会为其分配指定大小的内存空间,而未指定容量的 List 则会在添加元素时,根据需要动态分配内存空间。因此,使用指定容量的 List 可以减少内存分配的次数,从而提升性能。

参考资料

  • BenchmarkDotNet[1]

本文采用 Chat OpenAI 辅助注水浇筑而成,如有雷同,完全有可能。

  • 本文作者:newbe36524

  • 本文链接:https://www.newbe.pro/ChatAI/How-to-use-benchmark-to-compare-performance-about-list-with-capacity-specified/

  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

参考资料

[1]

BenchmarkDotNet: https://benchmarkdotnet.org/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看明星合影争C位,学PPT中C位排版法

在娱乐圈里&#xff0c;C位是大咖位&#xff0c;是对艺人实力的最好证明&#xff0c;艺人们自然会想着去力争C位&#xff0c;正所谓“不想当将军的兵不是好兵&#xff0c;不想站C位的明星不是好明星”。那么&#xff0c;C位是什么意思&#xff1f;C位&#xff0c;网络流行语&am…

javafx由浅到深的 认识(一)

javafx是一款比较新兴的语言框架,随着javafx越来越实用,估计许多程序员也会慢慢接触它,故我在这里对它由浅到深进行介绍一下. 首先,要了解javafx,就应该先知道.xml文件的布局软件,以往java都是通过敲代码来进行布局的,但javafx有力新的突破,它实现了拖动方式,目前我使用的辅助软…

linux用户的根目录_为什么Linux允许用户删除根目录?

linux用户的根目录Most of the time, none of us willingly performs an action that will literally break our operating systems and force us to reinstall them. But what if such an action could easily occur even by accident on the user’s part? Today’s SuperUs…

纯css实现叉号

HMTL部分 <a href"#" class"close"></a> CSS部分 .close {position: absolute;right: 32px;top: 32px;width: 32px;height: 32px; } .close:before, .close:after {position: absolute;left: 15px;content: ;height: 33px;width: 2px;backgro…

微软跨平台maui开发chatgpt客户端

image什么是maui.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创建本机移动(ios,andriod)和桌面(windows,mac)应用。imagechagpt最近这玩意很火&#xff0c;由于网页版本限制了ip&#xff0c;还得必须开代理&#xff0c; 用起来比较麻烦&a…

在Xshell 6开NumLock时按小键盘上的数字键并不能输入数字

小键盘问题 在Xshell 6上用vi的时候&#xff0c;开NumLock时按小键盘上的数字键并不能输入数字&#xff0c;而是出现一个字母然后换行&#xff08;实际上是命令模式上对应上下左右的键&#xff09;。解决方法 选项Terminal->Features里&#xff0c;找到Disable application …

WebP 在减少图片体积和流量上的效果如何?—— WebP 技术实践分享

作者 | Jackson编辑 | 尾尾 不论是 PC 还是移动端&#xff0c;图片一直占据着页面流量的大头&#xff0c;在图片的大小和质量之间如何权衡&#xff0c;成为了长期困扰开发者们的问题。而 WebP 技术的出现&#xff0c;为解决该问题提供了好的方案。本文将为大家详细介绍 WebP 技…

chrome 固定缩放比例_您如何调整Google Chrome浏览器的用户界面缩放比例?

chrome 固定缩放比例Everything can be going along nicely until a program gets a new update that suddenly turns everything into a visual mess, like scaling up the UI, for example. Is there a simple solution? Today’s SuperUser Q&A post has some helpful …

树莓派 Raspberry Pi 更换国内源

http://www.shumeipaiba.com/wanpai/jiaocheng/16.html转载于:https://www.cnblogs.com/Baronboy/p/9185849.html

优雅告别 2022 年,2023 年主题:敢想,就敢做!

自从工作之后&#xff0c;每年春节我都会花一天时间&#xff0c;一个人待在一个小房间&#xff0c;思考自己今年做了什么具备阶段性成果的事情。然后&#xff0c;写下明年需要执行的计划。会写在一个 XMind 文件里&#xff0c;记录每一年将要执行的计划&#xff0c;且未完成的计…

纯js上传文件 很好用

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>参数设置</title> <meta name"keywords&q…

买台电脑,不行!去旅游一下,不行!论程序员怎么实现财务自由!

“最近读了一本不是编程的程序员技能书《软技能-代码之外的生存指南》&#xff0c;全书分为 7 个篇章&#xff0c;分别是职业、自我营销、学习、生产力、理财、健身和精神。在读完职业、自我营销和理财这三个篇章后&#xff0c;让我感触很深&#xff0c;也让我很意外。本来以为…

java发送gmail_如何在Gmail中轻松通过电子邮件发送人群

java发送gmailMailing lists are an old tool in the email arsenal, but their implementation in Gmail isn’t immediately intuitive. Read on as we show you how to email groups using your Gmail account. 邮件列表是电子邮件库中的一个旧工具&#xff0c;但是在Gmail中…

移动web开发相关笔记(三)

1.推荐以sublime插件的排名官网:https://packagecontrol.io/&#xff08;sublime插件官网&#xff09;2.时间算法【//总秒数var totalSecond 3671;//获取里面的小时var hoursMath.floor(totalSecond/3600);//获取剩下的分钟var minuteMath.floor(totalSecond%3600/60);//获取剩…

互联网和IT行业越来越严峻,前景几何?

楔子新冠疫情反反复复&#xff0c;互联网和IT行业一路下滑。硅谷裁员高达10万人。前景该何处何从呢&#xff1f;春江水暖猪先知IT行业如此的不景气&#xff0c;自然是一些在风口上被吹起来的猪首先感受到了。他们进行的自救其实就一条:裁员&#xff0c;大量的裁员。裁员可以解决…

Asp.net MVC使用Model Binding解除Session, Cookie等依赖

上篇文章"Asp.net MVC使用Filter解除Session, Cookie等依赖"介绍了如何使用Filter来解除对于Session, Cookie的依赖。其实这个也可以通过Model Binding来达到同样的效果。 什么是Model Binding? Model Binding的作用就是将Request请求中包含的散乱参数&#xff0c;根…

C++回声服务器_4-UDP connect版本客户端

针对UDP套接字调用connect函数不会与对方UDP套接字建立连接&#xff0c;只是向UDP套接字注册目标IP和端口信息。 修改客户端代码 服务器代码不需要修改&#xff0c;只需修改客户端代码。调用connect函数之后&#xff0c;可以调用write函数和read函数来发送、接收数据&#xff0…

如何在路由绑定中使用 IParsable

IParsable 是 .Net 7 中新增的接口&#xff0c;它可以将字符串转换为对应的实体。在 Controller 的 Route 绑定中可以使用 IParsable 来绑定复杂的实体。实验背景 假设有一个需要将 route "report/{month}-{day}" 绑定到 MyDate 对象上的场景。在 .Net 7 之前&#x…

火狐 新增标签 一直加载_在Firefox的新标签页中加载最后标签页的URL

火狐 新增标签 一直加载Yeah, you’re pretty sure that you’re the master of all things Firefox. I mean, why else would you be reading this article? So, we’ve got to ask, have you ever seen this one before? 是的&#xff0c;您很确定自己是Firefox的所有人。 …

ptyhon【递归练习】

转载于:https://www.cnblogs.com/LTEF/p/9187287.html