2

这是monotouch / xamarin环境的一个更通用的软件架构问题。

这是我的问题:

我目前正在构建的应用程序在应用程序启动时下载了大约 30k 的 json 对象(6mb)。然后数据在本地存储,因此所有屏幕都进行本地 db (sqlite) 调用。

主要问题是执行下载所需的时间。目前,模拟器总共大约需要 36 秒,分为以下任务:

  1. 下载 ~ 10 秒
  2. 数据转换(json 到本机 obj)~ 16 秒
  3. 数据库插入 ~ 10 秒

这太长了,尤其是当我将它与应用商店中的类似应用进行比较时。我觉得我没有在这里做某事,或者没有意识到另一种方式?以下是我实施的改进:

  1. gzip 响应 - 当前为 6mb,使用 gzip 时下降到 ~ 1mb
  2. 安装 ServiceStack.Text json 序列化器,比 json.net 快大约 2.5 倍(但仍然 16 秒太长)
  3. 扁平化 json 响应,因此我可以在响应数组上执行 db.InsertAll()(无需额外循环等)以获取更多 robost db 导入(事务)
  4. 每天一次通话限制

现在,我想做的是在应用启动时显示本地数据并在后台初始化下载/更新程序。唯一的问题是下载所需的时间+新安装的应用程序将没有任何本地数据可显示...

我的问题是:

  1. mvc 4 api -> json convert -> sqlite import 是这种类型应用程序的好方法吗?如果不是 - 有哪些替代方案?

我一直在考虑服务器在压缩响应中返回实际的 sqlite 文件,或者返回压缩的 db 命令……或者 sqlite 不适合这种类型的应用程序?本地存储是否有更好的替代方案?.net 序列化程序/xml 等?

感谢您的所有建议!

4

1 回答 1

2

我的建议是异步完成你的工作——你很幸运,因为 C# 让这很容易。例如

  1. 开始后台下载;
  2. 在下载对象时处理(背景)对象;
  3. 在处理对象时插入(背景)对象;
  4. 如果适用,为您添加的每个 X 对象更新 UI(从主线程);

由于下载(大多数情况下,请参见注释)是网络绑定的,因此您的 CPU 将空闲几秒钟。考虑到您的下一步(处理)将受 CPU 限制,这是浪费时间。甚至更多,因为之后的步骤可能会受到 I/O 限制(数据库)。

IOW在向应用程序用户提供进度反馈(显示数据或进度条)的同时同时运行所有三个任务似乎是一个好主意。

注意#1:压缩后的响应会下载得更快。OTOH 在本地解压缩需要一些额外的(CPU)时间。它应该更快,但值得衡量这两个选项(例如,使用 Apple 的 Instrument 工具,它与 Xamarin.iOS 配合得很好)。

注意 #2:作为响应,一个zip文件也需要额外的时间(解压缩)。这不是您想要在下载后按顺序执行的操作(但您可以在下载时解压缩它)。

于 2013-06-20T13:30:02.000 回答