我有一个针对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与dotnet功能相比表现良好。例如,net35在System.Collections.Concurrent命名空间中没有任何类型。有可能用BenchmarkDotNet进行这种类型的基准测试吗?如果有,如何进行?
new CachingActivatorFactory(
#if NET35
new ReaderWriterCache<ConstructorInfo, Func<object[], object>>(),
#else
new ConcurrentCache<ConstructorInfo, Func<object[],object>>(),
#endif
new LambdaExpressionActivatorFactory(
#if NET45 || NETSTANDARD
new IlEmitCompiler()
#else
new SystemExpressionCompiler()
#endif
)
)
考虑到benchmarkdotnet的每个版本都支持什么,您将受到限制。
当前版本0.11.5支持.net标准2.0,该标准将支持.net core>2.0和.net framework>4.6.1。因此这些将是您可以测试的目标。
因此,例如,我可以将基准测试项目的目标定为net461和netcoreapp2.2。您的列表中还包含了.net标准,但由于它不是运行时,因此无法将其作为目标。在任何情况下,你都必须将你的项目目标设置为:
<TargetFrameworks>netcoreapp2.2;net461;</TargetFrameworks>
然后你用装饰你的测试课
[CoreJob, ClrJob]
然而,还有一项工作要做,那就是限制benchmarkdotnet库所支持的内容在常见问题解答中显示。
Q我的源代码针对旧版本的.NET Framework或.NET Core,但BenchmarkDotNet需要net461和netcoreapp2.0。我该怎么办在这种情况下运行基准测试?
A引入一个额外的控制台应用程序(例如,MyAwesomeLibrary.Bbenchmarks(是一个很好的做法,它将取决于您的代码和BenchmarkDotNet。由于用户通常运行开发环境中的基准测试,而不是分发基准测试对于用户来说,这应该不是问题。