我们在App中使用Newtonsoft.Json并且喜欢它!然而,我们最近想要优化我们的应用程序启动时间,并通过测量各种事情发现,每当我们第一次反序列化一些JSON时,存在大约800毫秒到1秒的巨大延迟。如果我们使用JsonConver.DeserializeObject()或新的JsonSerializer()并不重要,滞后总是第一次被注意到。
我在这里做了一个小的回购案例:https://github.com/monostefan/json.net_android_slow_start
有人知道为什么Xamarin.Android上这么慢吗?可能有一个解决方法吗?
我们的一个用户遇到了这个问题并设法通过在一个单独的线程中进行反序列化来解决它:https://forums.xamarin.com/discussion/comment/272208/#Comment_272208
我非常怀疑这是线程同步的问题。
我瞥见了你的代码。与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()
);
尝试将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项目没有第一次性能损失。
对我而言,Xamarin.Android看起来有些不对劲。按照lirkki的建议降级到8.0.3有助于减少延迟,但不能解决问题。
我解决这个问题的方法是在程序加载到一个单独的线程中时(如其他人所建议的那样)立即调用一个虚拟的DeserializeObject调用,然后当我开始使用它时,第一个虚拟调用是完成了,延误消失了。例如。:
Task.Factory.StartNew(() => { var o = JsonConvert.DeserializeObject<DummyJsonObject>(dummyJson); });
但这可能不是解决此问题的最佳方法。