Blazor WebAssembly反序列化甚至比下载慢得多?怎么啦? [英] Blazor WebAssembly deserializing is much slower than even the download? What is wrong?
本文介绍了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屋!
查看全文