问题标签 [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.
benchmarkdotnet - 硬件计数器上 LLCMisses 和 CacheMisses 的区别
LLCMisses 和 CacheMisses 有什么区别?
c# - C# for-loop 和 Array.Fill 之间的性能差异
我已经使用以下基准实现了BenchmarkDotNet
:
结果是:
最初我猜测它Array.Fill
做了一些优化,使其性能优于for
-loop,但后来我检查了 . NET Core 源代码,可以看到Array.Fill
实现非常简单:
性能已经足够接近了,但它仍然似乎Fill
始终比它快一点,for
即使在引擎盖下它是完全相同的代码。你能解释一下为什么吗?还是我只是错误地阅读了结果?
c# - 使用 benchmarkdotnet 执行性能测试,而不在 .netcore 中生成解决方案(.sln)文件
我有一个没有 .sln 文件的 dotnet 核心项目。我使用 nuget 包 benchmarkdotnet 添加了一个基准测试。但是性能结果是给出错误找不到 .sln 文件。有没有其他方法可以在不生成 .sln 文件的情况下运行基准测试。任何帮助表示赞赏。谢谢。
azure-devops - 基于性能回归的 Azure DevOps 通过/失败构建
对于一个新项目,我想通过使用 BenchmarkDotNet 构建性能测试套件来跟踪应用程序性能。有谁知道是否已经构建了任何东西来根据性能结果通过/失败 Azure DevOps 构建?例如,如果性能测试突然比上一次运行慢三倍,我希望构建失败。我听说一些团队一直在运行绩效指标,但从未听说过如何设置类似的东西。
我看到使用 BenchmarkDotNet 我可以导出结果。但我希望已经存在一些东西,而不必为此创建自己的解决方案。
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 做到这一点?
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 执行。
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 属性结果:
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。流也参与其中(当然!)。StringReader
string
然后我决定更深入地StreamReader
研究它自己,第一眼看到我就惊呆了——它总是分配数组缓冲区 ( byte[]
): StreamReader:244,这解释了它的内存使用情况。
这给了我“为什么”的答案。解决方案很简单 - 实例化时使用较小的缓冲区大小StreamReader
- 最小缓冲区大小默认为 128(请参阅参考资料StreamReader.MinBufferSize
),但您可以提供任何值> 0
(检查 ctor 过载之一)。
当然缓冲区大小对处理数据有影响。回答我应该使用什么缓冲区大小:这取决于. 当期望较小的 JSON 响应时,我认为坚持使用小缓冲区是安全的。
c# - 将扩展与 BenchmarkDotNet 进行比较
我有一个需要迭代集合的方法(准确地说是 DataRowCollection)。
当前的实现有点慢,所以我一直在尝试更快的实现。我使用 BenchmarkDotNet 将执行时间与相同的参数进行比较,如果集合足够大,它明显更快。
我的怀疑是,如果集合相对较小,情况就不会如此。因此,我真的很想比较两者的规模:在 1、10、100、1,000、10,000 个元素时哪个更快?
据我所知,BenchmarkDotNet 没有为此提供内置工具。我想要将一个对集合的引用传递给它,并让它执行具有不同大小或切片的方法。(例如通过将其复制到不同大小的 IList 中。)
azure-devops - 在 Azure Pipeline 中运行 BenchmarkDotNet 基准测试
我正在尝试在 Azure DevOps 管道中运行使用 BenchmarkDotNet 创建的基准。这是我遇到问题的构建。看看运行基准测试步骤。如您所见,所有带有基准的测试都通过了,但实际上没有执行任何基准测试。来自日志的消息:
如果我将InProcess
属性添加到具有基准的类,则将执行基准。但是我的一些基准测试运行时间很长,因此它们被 BenchmarkDotNet 中断,并建议使用进程外基准测试。
如何在 Azure 管道中运行进程外基准测试?