1

我有一个针对 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 进行此类基准测试,如果可以,如何进行?

    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  
        )
    )
4

1 回答 1

1

好吧,鉴于 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]

然而,有一个解决方法是限制在FAQ中的 benchmarkdotnet 库支持的内容。

Q我的源代码针对旧版本的 .NET Framework 或 .NET Core,但 BenchmarkDotNet 需要 net461 和 netcoreapp2.0。在这种情况下如何运行基准测试?

A引入额外的控制台应用程序(例如 MyAwesomeLibrary.Benchmarks)是一个很好的做法,这将取决于您的代码和 BenchmarkDotNet。由于用户通常在开发环境中运行基准测试并且不为用户分发基准测试,这应该不是问题。

于 2019-04-28T16:32:59.953 回答