如何在BenchmarkDotNet中对同一非NuGet库的两个不同版本进行基准测试?

时间:2019-11-22 08:32:41

标签: benchmarkdotnet

我正在尝试使用BenchmarkDotNet为库准备性能回归测试。这要求我将相同的测试与该库的较旧(稳定)版本进行比较。现在,有一个选项可以给different versions of a NuGet package to a job。似乎没有选择引用其他程序集的选项。

我尝试了自定义构建配置:

ubuntu 18.04

但是当尝试通过BenchmarkDotNet使用那些配置时

  <ItemGroup Condition="'$(Configuration)' == 'Baseline'">
    <Reference Include="MyAssembly">
      <HintPath>lib\baseline\MyAssembly.dll</HintPath>
    </Reference>
  </ItemGroup>

  <ItemGroup Condition="'$(Configuration)' != 'Baseline'">
    <Reference Include="MyAssembly">
      <HintPath>lib\current\MyAssembly.dll</HintPath>
    </Reference>
  </ItemGroup>

我收到表明根本没有引用程序集的生成错误。 BenchmarkDotNet还可以帮助清除它创建的任何临时工件,因此我什至无法查看生成的项目文件以了解其外观。

这里唯一的解决方法是将库包装在NuGet包中吗?还是我在(对于这种情况看似稀疏的)文档中忽略了某些东西?

This issue似乎与我遇到的构建错误有关。

1 个答案:

答案 0 :(得分:0)

我能够得到类似的工作,这也许也对您有用。就我而言,我想从基准项目的相同版本中引用NuGet和本地项目。

在同时添加了PackageReferenceProjectReference之后,我(手动)将Aliases添加到了ProjectReference

<ItemGroup>
  <ProjectReference Include="..\src\Combinatorics\Combinatorics.csproj" Aliases="localbuild" />
</ItemGroup>

dll名称确实需要不同(因为两个dll都位于输出目录中)。因此,我更改了所引用项目的dll名称(但仅在本地构建时,而不是在进行连续集成构建时):

<PropertyGroup>
  <AssemblyName Condition="'$(CI)'!='true'">local.Combinatorics</AssemblyName>
</PropertyGroup>

然后,我可以使用extern aliasusing在同一应用中使用两个程序集:

extern alias localbuild;
using NugetCombinatorics = Combinatorics.Collections;
using LocalCombinatorics = localbuild::Combinatorics.Collections;

...

[BenchmarkCategory("Enumerate"), Benchmark(Baseline = true)]
public void EnumerateOld()
{
    var permutations = new NugetCombinatorics.Permutations<int>(_source);
    foreach (var p in permutations)
        ;
}

[BenchmarkCategory("Enumerate"), Benchmark]
public void EnumerateNew()
{
    var permutations = new LocalCombinatorics.Permutations<int>(_source);
    foreach (var p in permutations)
        ;
}

重复的代码并不理想,我有点滥用类别而不是使用适当的运行方式,但是它可以完成工作。