我有一些代码行,它们在Xamarin.Forms中运行良好,但在客户端Blazor中表现很差。
这是代码:
string s = System.Text.Encoding.UTF8.GetString(Properties.Resources.city_list);
List _cityList = JsonConvert.DeserializeObject<List>(s).ToList();
city_list是OpenWeatherMap中的一个庞大列表,包含了全球所有城市。稍后,我想将此列表显示为select中的选项,因此我希望将其保留在客户端上。现在的代码很慢,运行它需要几分钟时间。你知道如何让它更快吗?
提前谢谢Janos
更新:我删除了Take(20(,因为这不是问题的一部分。我想得到完整的名单。
city_list是Json格式的文本文件。我把它添加为Resource,所以它在这段代码中是一个字节数组。
这个问题与Blazor中非常慢的字符串解析有关。昨天,我在解析6mb的json数据时遇到了同样的问题。即使使用较小的json数据,页面登录之间的延迟也很明显。不过,在非Blazor.NET应用程序中,解析速度非常快。
所以我弄清楚了问题是关于json解析还是一般的字符串解析。我在reguler控制台应用程序和Blazor WebAssembly上测试了以下代码。差异是巨大的:控制台(768毫秒(,Blazor 45(秒(。这似乎是web程序集的一个问题,因为javascript解析也很快。这个问题已经存在一段时间了。另请参见此处。https://github.com/dotnet/runtime/issues/40386
话虽如此,尽管这是一个非常简单的问题,但它完全使Blazor作为一个可用于生产的框架无效。
这已经在控制台和Blazor的.NET6上进行了测试。
public class StringParsePerfTest
{
private string Text { get; set; } = "";
public StringParsePerfTest()
{
for(int i = 0; i < 10000; i++)
{
if (i % 3 == 0) Text += "|";
else Text += "a";
}
}
public void Test()
{
var start = DateTime.Now;
start= DateTime.Now;
for(int i = 0; i < 10000; i++)
{
var splitted = Text.Split("|");
}
var end = DateTime.Now;
Console.WriteLine($"{(end - start).TotalMilliseconds}");
}
}