Blazor WebAssembly反序列化甚至比下载慢得多?怎么啦? [英] Blazor WebAssembly deserializing is much slower than even the download? What is wrong?

查看:67
本文介绍了Blazor WebAssembly反序列化甚至比下载慢得多?怎么啦?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Blazor应用程序中,我有一个组件具有如下方法。(我已将GetFromJsonAsync调用替换为它内部的代码,以缩小缓慢部分的范围。)

  private async Task GetData()
  {
      IsLoading = true;
      string url = $".../api/v1/Foo";  // will return a 1.5 MB JSON array
      var client = clientFactory.CreateClient("MyNamedClient");

      Console.WriteLine($"starting");

      List<Foo> results;

      Task<HttpResponseMessage> taskResponse = client.GetAsync(url, HttpCompletionOption.ResponseContentRead, default);

      var sw = Stopwatch.StartNew();
      using (HttpResponseMessage response = await taskResponse)
      {
        
        response.EnsureSuccessStatusCode();
        var content = response.Content!;

        if (content == null)
        {
          throw new ArgumentNullException(nameof(content));
        }
        
        string contentString = await content.ReadAsStringAsync();

        sw.Stop();
        Console.WriteLine($"Read string: {sw.Elapsed}");
        sw.Restart();

        results = System.Text.Json.JsonSerializer.Deserialize<List<Foo>>(contentString);

      }

      sw.Stop();
      Console.WriteLine($"Deserialize: {sw.Elapsed}");
      
      StateHasChanged();
      IsLoading = false;

我1.5MB的下载需要1-6秒,但操作的睡觉(在此期间UI被屏蔽)需要10-30秒。这只是ReadFromJsonAsync(内部调用System.Text.Json.JsonSerializer.Deserialize)中的反序列化速度较慢,还是这里发生了其他事情我如何才能提高获取如此庞大的数据集的效率(尽管我认为它并不是那么大!)

为简化起见,我注释掉了任何绑定到Results的内容,而我只有一个绑定到IsLoading的指示器。这告诉我更新DOM或呈现没有问题。

当我在自动化集成测试中尝试相同的代码集时,只需要3秒左右。WebAssembly在反序列化方面真的那么慢吗?如果是这样的话,在我的站点上到处检索非常小的数据集是唯一的解决方案吗?我觉得这不太对劲。

以下是运行上述代码产生的浏览器控制台日志:

VM1131:1 Fetch finished loading: GET "https://localhost:5001/api/v1/Foo".
read string 00:00:05.5464300
Deserialize: 00:00:15.4109950
L: GC_MAJOR_SWEEP: major size: 3232K in use: 28547K
L: GC_MAJOR: (LOS overflow) time 18.49ms, stw 18.50ms los size: 2048K in use: 187K
L: GC_MINOR: (LOS overflow) time 0.33ms, stw 0.37ms promoted 0K major size: 3232K in use: 2014K los size: 2048K in use: 187K

这里是Chrome性能图表,这是它的价值所在。绿色表示下载,橙色表示执行微任务,我认为这表示WebAssembly工作。

推荐答案

还是这里发生了其他事情?

看起来是这样的。您没有说明您使用的是什么硬件,但是在我的桌面(I7)上,我可以在<;100ms(Localhost)内下载,反序列化需要<;4秒。调试模式和发布模式或浏览器之间没有太大差异。

所以,仅仅从localhost下载5秒就已经非常奇怪了。您的设置中有问题。

MCVE:

  • 从Wasm托管模板开始
  • 让控制器返回~17000个项目(WAS 5)以获得~1.5MB
  • 将代码放入FetchData OnInit(),用WeatherForecast替换foo
  • 不要尝试全部呈现它们。

查看您为此获得的结果。

这篇关于Blazor WebAssembly反序列化甚至比下载慢得多?怎么啦?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆