我正在尝试使用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似乎与我遇到的构建错误有关。
答案 0 :(得分:0)
我能够得到类似的工作,这也许也对您有用。就我而言,我想从基准项目的相同版本中引用NuGet和本地项目。
在同时添加了PackageReference
和ProjectReference
之后,我(手动)将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 alias
和using
在同一应用中使用两个程序集:
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)
;
}
重复的代码并不理想,我有点滥用类别而不是使用适当的运行方式,但是它可以完成工作。