【发布时间】:2016-03-04 19:38:11
【问题描述】:
我在开发 Kivy 应用程序方面已经走了很长一段路。它针对 android,但也可以在台式机上运行(同时使用不同的皮肤),希望最终能在 iO 上运行。
我大量使用的基本依赖项是:-
twisted - 使用它作为 IPC,我的应用程序有一个服务器/客户端 数据操作和 UI 之间的关系
Whoosh - 用于文本搜索
xmltodict - 便于 XML 操作
我在 Android 上的应用启动时间真的很长,在一部相对较新的手机上,这不是好兆头。根据我的粗略时间(基于 time.time() 并从我的应用的 init 时间中减去):-
我的应用在大约 1 秒后从 kivy 启动获得控制权
我的自定义类等的初始化在 2.4 秒标记完成
在 14.4 秒时,我终于完成了大部分数据加载
在 17 秒时,我开始使用 twisted 将数据发送到客户端 UI
在 22 秒标记处,UI 接收数据
我想在这里解决多个问题。例如,大约 5 秒的数据发送间隔可以很容易地分解并在 UI 中零碎更新,所以我将其保留到以后,但我需要询问关于数据加载的 12 秒长间隔。此数据加载涉及创建大约 1000 个自定义类的实例,步骤如下(累计时间超过 1000 个实例):-
从 1000 个文本 XML 文件中读取数据(0.734 秒)
解析读取数据中的XML(9.198秒)
根据解析的 XML 填充对象的变量(0.585 秒)
目录树遍历(用来定位某个基础文件夹,0.0824秒)
xml 文件的时间测量(0.12 秒)
测得的时间让我感到惊讶,因为在我的笔记本电脑上运行相同代码的等效时间分别为 0.041、0.9、0.062、0.009 和 0.016)。一切都慢了大约 10 倍。
如果有的话,我能做些什么呢?用于测试的手机有 3GB 的 RAM 和 Snapdragon 801 处理器,所以我很担心在较慢/较旧的型号上使用这个应用程序。我最初的想法是速度变慢是由于 sd 卡本质上比我笔记本电脑的硬盘驱动器慢,但是 xml 解析(与 IO 无关)花了这么长时间似乎表明处理问题。
欢迎提出建议/批评。
【问题讨论】:
-
你能用比xml更方便的方式存储数据吗? pickle 甚至 json 怎么样?
-
我已经考虑过了,但是由于遗留原因,我的基础数据源需要是 xml。我目前正在考虑在启动时使用一个缓存(可能是腌制),一旦数据读取线程发现差异,它就会更新。但这只是在以后推动问题......
-
看看能不能得到lxml库,编译好了,应该会快很多。我肯定会把所有我能做的东西都缓存起来,即使这只会减少一秒钟的启动时间。
-
我已经在 lxml 中快速实现了瓶颈 XML 代码(读取),它将运行时间缩短了一半。尽管如此,它仍然可能太慢了一个数量级,让我有 10 多秒的启动时间,这并不能解决整个“为什么它在 Android 上这么慢”的问题。
-
我打算建议优化不佳的 python 解释器/xml 模块,但由于 LXML 本身运行并且也很慢,所以它是 python 之外的东西。也许将文件从 SD 卡移动到板载存储。
标签: android python optimization kivy