我有一个基准类,其代码类似于以下内容:
[GlobalSetup]
public async Task Setup()
{
await Task.Delay(1000 * 10);
Console.WriteLine("Got here...");
}
[Benchmark]
public async Task Benchmark()
{
await OtherCode();
}
当我运行此命令时,OtherCode 在 GlobalSetup 完全完成之前运行。这是 BenchmarkDotNet 中的错误,还是我可能做错了什么?
我尝试过在线搜索,但大多数结果都带来了同样的几篇文章,但没有任何有用的信息。
编辑:
https://github.com/dotnet/BenchmarkDotNet/issues/1738
此链接显示了类似的问题,但看起来并没有得到解决。有没有人处理过类似的问题,如果有,你的解决方法/解决方案是什么?
编辑2:
通过我的具体设置,我能够让它工作,尽管它看起来确实有点老套。我在 GlobalSetup 中的代码是预先计算并存储在静态字段中的。然后我在基准类中引用了它。
还需要注意的是,我正在从 xunit 测试运行我的基准测试类,并在运行程序的作业配置中使用 InProcessEmitToolchain。
话虽这么说,我仍然很好奇为什么 GlobalSetup 没有得到正确的等待。这是正在修复的作品中,还是有意为之?
https://github.com/dotnet/BenchmarkDotNet/issues/1738#issuecomment-1687832731
根据这个问题,有一个拉取请求来解决这个问题,尽管它已经处于开放状态相当长一段时间了。正如拉取请求的作者提到的,临时解决方案是在 GlobalSetup 中同步等待结果
task.GetAwaiter().GetResult()
。我相信这比我原来的解决方案更有意义,因为它将您的逻辑保留在基准测试本身内,而不是通过静态包装器注入它。