问题标签 [benchmarkdotnet]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
195 浏览

benchmarkdotnet - 硬件计数器上 LLCMisses 和 CacheMisses 的区别

LLCMisses 和 CacheMisses 有什么区别?

0 投票
1 回答
1079 浏览

c# - C# for-loop 和 Array.Fill 之间的性能差异

我已经使用以下基准实现了BenchmarkDotNet

结果是:

最初我猜测它Array.Fill做了一些优化,使其性能优于for-loop,但后来我检查了 . NET Core 源代码,可以看到Array.Fill实现非常简单:

性能已经足够接近了,但它仍然似乎Fill始终比它快一点,for即使在引擎盖下它是完全相同的代码。你能解释一下为什么吗?还是我只是错误地阅读了结果?

0 投票
1 回答
299 浏览

c# - 使用 benchmarkdotnet 执行性能测试,而不在 .netcore 中生成解决方案(.sln)文件

我有一个没有 .sln 文件的 dotnet 核心项目。我使用 nuget 包 benchmarkdotnet 添加了一个基准测试。但是性能结果是给出错误找不到 .sln 文件。有没有其他方法可以在不生成 .sln 文件的情况下运行基准测试。任何帮助表示赞赏。谢谢。

0 投票
0 回答
124 浏览

azure-devops - 基于性能回归的 Azure DevOps 通过/失败构建

对于一个新项目,我想通过使用 BenchmarkDotNet 构建性能测试套件来跟踪应用程序性能。有谁知道是否已经构建了任何东西来根据性能结果通过/失败 Azure DevOps 构建?例如,如果性能测试突然比上一次运行慢三倍,我希望构建失败。我听说一些团队一直在运行绩效指标,但从未听说过如何设置类似的东西。

我看到使用 BenchmarkDotNet 我可以导出结果。但我希望已经存在一些东西,而不必为此创建自己的解决方案。

0 投票
1 回答
120 浏览

c# - 具有 2 个不同环境变量的 2 个不同基准

尝试对drawManaged()在两个不同 DLL 下运行的函数进行基准测试:

  • drawManaged()C#中的函数
  • drawManaged()通过 swig-interface调用drawNative()native1base.dll(或其他本机 dll)
  • 要加载的本机 DLL 可使用环境变量进行配置,%NATIVE_DLL_PATH%
  • 想要drawManaged()在 2 个不同的原生 DLL 中运行基准测试:native1base.dll 和 native2optimized.dll

如何使用 benchmarkdotnet 做到这一点?

0 投票
1 回答
118 浏览

benchmarkdotnet - Benchmarkdotnet 不尊重框架目标 net462

我有一个针对 netcoreapp2 和 net462 的小型基准测试项目。

然而,在运行这个基准测试时,它似乎只尊重 netcoreapp 目标,而不是完整的框架目标。它指出 CLR 作业是针对 net472 运行的。我可能做错了还是这是一个问题?我只针对两个工作 [CoreJob, ClrJob]。

[主机]:.NET Core 2.0.9(CoreCLR 4.6.26614.01,CoreFX 4.6.26614.01),64bit RyuJIT Clr:.NET Framework 4.7.2(CLR 4.0.30319.42000),64bit RyuJIT-v4.7.3394.0 Core:. NET Core 2.0.9(CoreCLR 4.6.26614.01、CoreFX 4.6.26614.01)、64 位 RyuJIT

我还注意到,即使我删除了显式作业属性并且仅将我的项目定位到 net462,运行摘要仍然显示它使用 net472 执行。

0 投票
1 回答
54 浏览

c# - 不同数量的结构参数改变基准测试结果

我正在使用 BenchmarkDotNet 对结构相关代码进行基准测试,并注意到我的基准测试的性能取决于我的结构包含的参数数量。

这个简单的基准测试创建结构并将它们添加到字典中(如果字典尚未包含它们)。StructKey() 和 ObjectKey() 之间的唯一区别是 Dictionary 的键类型,一个是 BoxingStruct,另一个是对象。在这个例子中,我的 UserStruct 只有一个字段。如果我运行它,我会得到以下结果:

现在,如果我向 UserStruct 添加更多元素,我的性能结果会翻转。

结果:

现在 StructKey 方法需要更多时间并分配更多内存。但我不知道为什么?我已经运行了多次,并且使用 8 和 16 个参数运行会得到类似的结果。

我已经阅读了structs 和 objects、 value v. reference type之间的区别。使用结构复制数据,但对象只是通过引用传递项目。String 是一种引用类型,所以我相当确定它没有存储在堆栈中。堆栈的存储容量有限,但我认为我还没有接近。通过让字典键成为一个对象,我是否对值类型进行了装箱?

综上所述,无论两个字典之间的性能差异如何,我都希望结构参数的数量不会改变哪种方法的性能更高。如果有人能详细说明影响这些基准性能的原因,我将不胜感激。

我在运行 dotnet core 2.2.300 的 Windows 机器上,在发布模式下运行基准测试,这是一个包含我的基准测试的Github存储库。

编辑

我同时实现了 IEquatable 和 IEqualityComparer,性能实际上变差了,并且仍然存在相同的关系。使用 1 个属性 StructKey() 更快,使用更少的内存,而使用 4 个属性 ObjectKey() 更快,使用更少的内存。

1 属性结果:

4 属性结果:

0 投票
1 回答
1622 浏览

c# - 基准测试 Newtonsoft.Json 反序列化:来自流和来自字符串

我对如何使用Newtonsoft.Json反序列化 HTTP 响应 JSON 有效负载的两种方法的性能(速度、内存使用)比较感兴趣。

我知道Newtonsoft.Json 的使用流的性能提示,但我想知道更多并有确切的数字。我已经使用BenchmarkDotNet编写了简单的基准测试,但我对结果感到有些困惑(见下面的数字)。

我得到了什么:

  • 从流中解析总是更快,但不是很多
  • 使用字符串作为输入时,解析小型和“中型”JSON 具有更好或相同的内存使用率
  • 使用大 JSON 开始出现内存使用的显着差异(其中字符串本身以 LOH 结尾)

我没有时间进行正确的分析(还),我对流方法的内存开销感到有点惊讶(如果没有错误的话)。完整的代码在这里

?

  • 我的方法正确吗?(使用MemoryStream;模拟HttpResponseMessage及其内容;...)
  • 基准测试代码有什么问题吗?
  • 为什么我会看到这样的结果?

基准设置

我正准备MemoryStream在基准测试中反复使用:

流反序列化

字符串反序列化

我们首先从流中读取 JSON 到字符串,然后运行反序列化 - 正在分配另一个字符串,然后用于反序列化。

常用方法

结果

小 JSON

重复 10000 次

  • 流:平均 25.69 毫秒,已分配 61.34 MB
  • 字符串:平均 31.22 毫秒,已分配 36.01 MB

中等 JSON

重复 1000 次

  • 流:平均 24.07 毫秒,已分配 12 MB
  • 字符串:平均 25.09 毫秒,已分配 12.85 MB

大型 JSON

重复 100 次

  • 流:平均 229.6 毫秒,分配 47.54 MB,对象到达第 1 代
  • 字符串:平均 240.8 毫秒,分配 92.42 MB,对象到达第 2 代!

更新

我通过源代码JsonConvert发现它在反序列化时在内部JsonTextReader使用:JsonConvert:816。流也参与其中(当然!)。StringReaderstring

然后我决定更深入地StreamReader研究它自己,第一眼看到我就惊呆了——它总是分配数组缓冲区 ( byte[]): StreamReader:244,这解释了它的内存使用情况。

这给了我“为什么”的答案。解决方案很简单 - 实例化时使用较小的缓冲区大小StreamReader- 最小缓冲区大小默认为 128(请参阅参考资料StreamReader.MinBufferSize),但您可以提供任何值> 0(检查 ctor 过载之一)。

当然缓冲区大小处理数据有影响。回答我应该使用什么缓冲区大小:这取决于. 当期望较小的 JSON 响应时,我认为坚持使用小缓冲区是安全的。

0 投票
1 回答
101 浏览

c# - 将扩展与 BenchmarkDotNet 进行比较

我有一个需要迭代集合的方法(准确地说是 DataRowCollection)。

当前的实现有点慢,所以我一直在尝试更快的实现。我使用 BenchmarkDotNet 将执行时间与相同的参数进行比较,如果集合足够大,它明显更快。

我的怀疑是,如果集合相对较小,情况就不会如此。因此,我真的很想比较两者的规模:在 1、10、100、1,000、10,000 个元素时哪个更快?

据我所知,BenchmarkDotNet 没有为此提供内置工具。我想要将一个对集合的引用传递给它,并让它执行具有不同大小或切片的方法。(例如通过将其复制到不同大小的 IList 中。)

基本上,以http://ridiculousfish.com/blog/posts/array.html上的图表结束

0 投票
0 回答
787 浏览

azure-devops - 在 Azure Pipeline 中运行 BenchmarkDotNet 基准测试

我正在尝试在 Azure DevOps 管道中运行使用 BenchmarkDotNet 创建的基准。是我遇到问题的构建。看看运行基准测试步骤。如您所见,所有带有基准的测试都通过了,但实际上没有执行任何基准测试。来自日志的消息:

如果我将InProcess属性添加到具有基准的类,则将执行基准。但是我的一些基准测试运行时间很长,因此它们被 BenchmarkDotNet 中断,并建议使用进程外基准测试。

如何在 Azure 管道中运行进程外基准测试?