问题标签 [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.
memory-leaks - DI 容器泄漏内存或 BenchmarksDotNet MemoryDiagnoser 提供不准确的测量?
介绍
我们正在尝试使用BenchmarksDotNet
.
为了简单起见,这里是一个简单的例子TestClass
:
我们正在通过以下 NUnit 测试实施基准测试netcoreapp2.0
:
测试输出包含以下摘要:
测试输出还包含所有Console.Write
输出,这证明0 B
这里意味着没有内存泄漏,而不是由于编译器优化而没有运行代码。
问题
当我们尝试TestClass
使用TinyIoC
容器解决时,混乱就开始了:
摘要表明 1.07 KB 被泄露。
Allocated
ResolveTestClass
值与来自 的调用次数成比例增加TestBenchmark1
,总结为
是
这表明要么TinyIoC
保留对每个已解析对象的引用(根据源代码,这似乎不是真的),要么BenchmarksDotNet
测量包括在标有[Benchmark]
属性的方法之外的一些额外内存分配。
两种情况下使用的配置:
顺便说一句,用TinyIoC
依赖Autofac
注入框架替换并没有太大改变这种情况。
问题
这是否意味着所有 DI 框架都必须为已解析的对象实现某种缓存?这是否意味着BenchmarksDotNet
在给定示例中以错误的方式使用?NUnit
首先使用和的组合来寻找内存泄漏是个好主意BenchmarksDotNet
吗?
c# - 带有异步任务的 BenchmarkDotNet
我正在尝试运行此代码:
电话是
我很确定我做错了很多事情(因为它不起作用);我总是收到未找到基准的消息,并且从我发现的样本中我找不到如何使其工作。
我想反序列化来自 NewtonSoft 和 ServiceStack 给出的 url 的相同响应的 1000 倍,并从中获得良好的基准。我怎样才能使这段代码工作,我做错了什么?
.net-core - BenchmarkDotNet StringConcats 与 StringFormat
我在 Windows 10 64 位操作系统上使用 .net core 2.0.5。每次,我都会使用 string.Concat 或 string.Format 连接字符串,因为我了解到使用字符串“abc”+“def”的性能更差。(内存使用是一个不同的话题。) - 我最近对字符串连接进行了基准测试,但结果非常有趣;
结果;
StringConcat001 怎么最快?
难道我做错了什么?还是我错误配置了 benchmarkdotnet?
performance-testing - 如果性能下降太多,是否可以使用 Benchmark.NET 使 CI 构建“失败”?
我有单元测试。如果其中一个失败,我的构建就会失败。
我想将相同的原则应用于性能。我有一系列通过库的几个热路径的微基准。根据经验,这些领域的放缓对图书馆的整体性能产生了不成比例的影响。
如果有某种方法可以让某个“性能构建”概念在过于显着的性能回归的情况下失败,那就太好了。
我曾考虑过不得超过的硬编码阈值。就像是:
Assert.IsTrue(hotPathTestResult.TotalTime <= threshold)
但是将其与绝对值挂钩取决于硬件和环境,因此很脆弱。
有没有人实施过这样的事情?微软为 Kestrel 做了什么?
benchmarkdotnet - BenchmarkDotNet - 基准多目标项目
我有一个针对 net35、net40、net45 和 netstandard2.0 的项目。(https://weblog.west-wind.com/posts/2017/Jun/22/MultiTargeting-and-Porting-a-NET-Library-to-NET-Core-20)。我想对我所针对的每个版本的 dotnet 进行基准测试,以确保我为旧版本的 .Net 中缺少的功能创建的 polyfill 与 .Net 功能相比表现得不错。例如 net35 在 System.Collections.Concurrent 命名空间中没有任何类型。是否可以使用 BenchmarkDotNet 进行此类基准测试,如果可以,如何进行?
c# - 为什么 Mono 运行简单方法的速度较慢,而 RyuJIT 运行速度明显更快?
出于好奇,我创建了一个简单的基准,但无法解释结果。
作为基准数据,我准备了一个带有一些随机值的结构数组。准备阶段没有基准:
基本上,我想比较这两种钳位实现:
这是我的基准方法:
我正在使用BenchmarkDotNet 0.10.12 版进行两项工作:
这些是我得到的结果:
我可以接受 Mono 在这里一般来说有点慢。但我不明白的是:
为什么 Mono 运行该Direct
方法的速度比Extension
记住Direct
使用非常简单的比较方法而Extension
使用带有其他方法调用的方法要慢?
RyuJIT 在这里展示了简单方法的 4 倍优势。
谁能解释一下?
c# - 如何解释 BenchmarkDotNet 和 dotMemory 的结果?
所以,我的Main()
方法中有以下一段代码
接下来,我有下面的类在测试下
运行大约 6 分钟后,我收到以下Main()
结果dotMemory
该应用程序从 开始10Mb
并上升到14Mb
。
但是当我运行BenchmarkDotnet
测试时,我得到了这个
我看到我已经被2.6GB
分配了。什么?似乎一点都不好。另外,我看不到Gen1
和Gen2
列。这是否意味着代码没有在其中分配任何东西,所以没有什么可显示的?
我如何解释结果?在 .中似乎完全可以DotMemory
,但在BenchmarkDotNet
. 我很新,BenchmarkDotnet
对有关结果的任何信息都有帮助。
PS。LogicUnderTest()
广泛适用于字符串。
PSS。大致LogicUnderTest
是这样实现的
c# - 激活结构而不将其存储为局部变量会比不将其存储为局部变量要慢吗?
我在 .NET Core 2.1 中遇到了一个我想了解的性能问题。可以在此处找到此代码:
https://github.com/mike-eee/StructureActivation
这是通过BenchmarkDotNet获得的相关基准代码:
从一开始,我就希望Activated
它更快,因为它不存储局部变量,我一直认为在当前堆栈上下文中定位和保留空间会导致性能损失。
但是,在运行测试时,我得到以下结果:
激活的结构(不存储局部变量)大约慢30% 。
作为参考,这里是 ReSharper 的 IL 查看器提供的 IL:
经检查,Activated
有两个newobj
而ActivatedAssignment
只有一个,这可能导致两个基准之间的差异。
我的问题是:这是预期的吗?我试图理解为什么代码较少的基准实际上比代码较多的基准要慢。任何指导/建议以确保我遵循最佳实践将不胜感激。
c# - 使用 Benchmark.NET + DevArt dotConnect for PostgreSQL 的许可错误
我正在开发一个由多个项目组成的应用程序,并使用 EntityFramework 和 dotConnect 来针对 PostgreSQL 运行。我还有一个 dotConnect 许可证,它可以在主应用程序中成功运行。
同时,我正在使用 Benchmark.Net 制作一个控制台应用程序(一种不同的解决方案)来衡量其中一个项目的逻辑性能。但是每次我运行基准测试时,我都会收到以下错误:
System.Reflection.TargetInvocationException:调用的目标已引发异常。---> System.Data.Entity.Core.EntityException:底层提供程序在打开时失败。---> Devart.Data.PostgreSql.PgSqlException:包含嵌入式 dotConnect for PostgreSQL 许可证的程序集不能用于此应用程序:0f238e83-669a-46b8-876f-40331880ee79.exe.exe。
按照这个说明,我已经licenses.licx
通过 Visual Studio 和<exe file>.licenses
通过lc.exe
. 但它仍然产生同样的错误。
我怀疑 Benchmark.NET 会生成自己的 exe 来运行导致此错误的基准测试,但我不确定 100%。因此,如果有人有解决方案,我正在寻找解决方案?
谢谢