我们在应用程序中使用newtonsoft.json并喜欢它!但是,我们最近想优化我们的应用启动时间,并通过测量各种事物来发现,每当我们首次对某些JSON进行测量,大约有800ms至1s的滞后。无论我们使用jsonconver.deserializeobject()还是新的jsonserializer(),这并不重要
我在这里制作了一个小的回购案例:https://github.com/monostefan/json.net_android_slow_start
有人知道为什么在xamarin.android上这么慢吗?并且可能有解决方法吗?
我们的一位用户正在遇到此问题,并通过在单独的线程中进行反序列化来解决它:https://forums.xamarin.com/discussion/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/comment/#remand_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。
我在您的项目中尝试了版本8.0.3 https://github.com/monostefan/json.net_android_slow_start,并且在那里完全没有帮助。但是,值得花几分钟来尝试一下,因为在我的项目中,降级版本解决了json.net的性能问题。
。对我来说,JSON.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&ltdummyjsonObject&gt(dummyjson);});
这可能不是解决此问题的最佳方法。