【问题标题】:can I load test this method with Task.WhenAll()?我可以使用 Task.WhenAll() 加载测试此方法吗?
【发布时间】:2018-06-28 00:38:51
【问题描述】:

我有以下方法,我想用 Task.WhenAll() 加载测试:

static async Task<User> GetUserAsync()
{
    return (await new ApiTester().GetUserAsync());
}

基本上,我想同时调用此方法 100 次,并在处理结束时确定每个方法调用的总经过时间和时间。如果你知道怎么做,你能提供代码吗?这对于 Task.WaitAll 专家来说可能很容易,但我只在一个非常具体的场景中使用过这种方法。

【问题讨论】:

  • 当然,使用BenchmarkDotNet
  • 问题是为什么?你想弄清楚什么。我的意思是它很容易使用StopWatch 和任务列表,但我不确定你在向自己证明什么,这是 IO 的东西,你加载完成端口,你将在上下文切换和线程池完成端口进出
  • @TheGeneral 重点是对 GetUserAsync 实现进行负载测试以验证它是否可以扩展
  • 两个问题——(1) 你的测试运行器可能有错误的SynchronizationContext 和(2) 性能动态几乎总是非线性的,这意味着你不能只通过测试得到有意义的结果系统的一部分是孤立的。您应该针对在类生产硬件上运行的完整应用程序进行性能测试。

标签: c# .net asynchronous async-await task


【解决方案1】:

您应该使用 BenchmarkDotNet。但是,这是实现您想要的一种粗略的方法。

你的方法

private static async Task<User> GetUserAsync() 
{    
   return await new ApiTester().GetUserAsync(); 
}

异步定时器任务

private static async Task<double> GetUserMsAsync()
{
   var sw = new Stopwatch();
   sw.Start();
   var user = await GetUserAsync();
   sw.Stop();

   return sw.Elapsed.TotalMilliseconds;
}

测试员

public static async Task Tester()
{
   var sw = new Stopwatch();

   try
   {
      var tasks = Enumerable.Range(0, 100)
                            .Select(x => GetUserMsAsync())
                            .ToArray();

      sw.Start();

      var results = await Task.WhenAll(tasks);

      foreach (var result in results)
      {
         Console.WriteLine(result);
      }
   }
   finally
   {
      sw.Stop();
      Console.WriteLine($"sw : {sw.Elapsed:c}");
   }
}

用法

private static void Main(string[] args)
{
   Tester().Wait();  
   Console.ReadKey();
}

免责声明,如果您不了解您正在测试的内容以及您正在测试的环境,这并不能证明太多。但是,我假设您知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多