我们在App中使用Newtonsoft.Json并且喜欢它!然而,我们最近想要优化我们的应用程序启动时间,并通过测量各种事情发现,每当我们第一次反序列化一些JSON时,存在大约800毫秒到1秒的巨大延迟。如果我们使用JsonConver.DeserializeObject()或新的JsonSerializer()并不重要,那么第一次时滞总是很明显。
我在这里做了一个小型回购案例:https://github.com/monostefan/json.net_android_slow_start
有人知道为什么Xamarin.Android会这么慢吗?可能有一种解决方法吗?
答案 0 :(得分:1)
我们的一位用户遇到了这个问题并设法通过在单独的线程中进行反序列化来解决它:https://forums.xamarin.com/discussion/comment/272208/#Comment_272208
答案 1 :(得分:1)
我非常怀疑这是线程同步的问题。
我瞥见了你的代码。使用await Task.Run()
可能ContextSynchronization
没有完美发生。我会尝试好的Task.Factory.StartNew
。
请试试以下内容。
await Task.Factory.StartNew(
() =>
{
**/* Perform the service/network call + deserialization here */**
}
).ContinueWith(
t =>
{
//Any thing that you were trying to do in main thread context
}, TaskScheduler.FromCurrentSynchronizationContext()
);
答案 2 :(得分:0)
尝试将Json.NET版本降级到8.0.3。
我在您的项目https://github.com/monostefan/json.net_android_slow_start中尝试了8.0.3版,但它并没有提供任何帮助。但值得花几分钟时间尝试一下,因为在我的项目中,降级版本解决了首次使用Json.NET时的性能问题。
对我来说,似乎Jama.NET的Xamarin.Android性能从版本9.0.1开始很糟糕,但Xamarin.iOS似乎没有受到影响。这也适用于最新的Json.NET版本10.0.2。首次使用Xamarin.Android中的任何对象序列化/反序列化都是慢得令人无法接受的,但对类似类型对象的后续操作很快。版本8.0.3对我目前的Xamarin.Android项目没有第一次性能损失。
答案 3 :(得分:0)
在我看来,Xamarin.Android中存在某些问题。按照lirkki的建议降级至8.0.3可以稍微减少延迟,但不能解决问题。
要解决此问题,我要做的就是在程序加载到单独的线程中时(如其他人所建议的那样)立即调用虚拟DeserializeObject调用,然后等到真正使用它时,第一个虚拟呼叫结束,延迟消失。 例如:
Task.Factory.StartNew(() => { var o = JsonConvert.DeserializeObject<DummyJsonObject>(dummyJson); });
但这可能不是解决此问题的最佳方法。