【发布时间】:2011-04-23 09:15:14
【问题描述】:
我最近创建了一个程序,它可以获取中等数量的 xml 数据并将其转换为字符串数组,然后显示数据。
该程序运行良好,但在创建数组时会冻结(大约 16 秒,具体取决于大小)。
有什么办法可以优化我的程序(字符串数组的替代方案等)
【问题讨论】:
标签: android xml optimization
我最近创建了一个程序,它可以获取中等数量的 xml 数据并将其转换为字符串数组,然后显示数据。
该程序运行良好,但在创建数组时会冻结(大约 16 秒,具体取决于大小)。
有什么办法可以优化我的程序(字符串数组的替代方案等)
【问题讨论】:
标签: android xml optimization
【讨论】:
您可以使用 SAX 来处理 XML 流,而不是尝试解析整个文件并在内存中生成 DOM。
【讨论】:
如果您发现您确实使用了太多内存,并且您有理由将字符串保存在内存中而不是将它们缓存在磁盘上,那么当然有一些方法可以减少内存需求。 Java 字符串占用大量空间是一个可悲的事实。它们需要两个对象(字符串本身和底层 char 数组)并且每个 char 使用两个字节。如果您的数据主要是 7 位 ASCII,则最好将其保留为 UTF-8 编码的字节流,在典型情况下每个字符使用 1 个字节。
一个非常有效的方案是维护一个 32k 字节缓冲区的数组,并将每个新字符串的 UTF-8 表示附加到其中一个数组的第一个空白空间。您对字符串的引用变成了一个简单的整数:PTR = (buffer index * 32k) + (buffer offset)。 “PTR/32k”产生所需字节缓冲区的索引,“PTR % 32k”产生缓冲区内的位置。使用初始长度字节或空终止符来跟踪字符串的长度。当您需要访问其中一个字符串时,不要分配新的 String 对象:将其解压缩到可变的 StringBuilder 中或直接使用 UTF-8 字节表示。
上述方法显然需要更多工作,但可以节省 2 到 6 倍的内存使用量(取决于字符串的长度)。但是,您应该注意过早的优化。如果您的问题在于解析输入的处理时间,或者是程序中的其他地方,您可能会发现您已经做了很多工作来解决不是您的瓶颈的问题,因此根本没有任何改进。
【讨论】: