代码之家  ›  专栏  ›  技术社区  ›  Novikov

如何在Android上有效地存储位集

  •  0
  • Novikov  · 技术社区  · 14 年前

    我的应用程序要求我在Android平台上存储位集以及一些附带的元数据(目前只读)。现在很明显,我可以实现串行接口,但我听说它在Android上非常慢(我可以想象,它必须与定制的虚拟机和编译器一起做一些事情,使这些反射功能效率低下)。 我应该:

    1. 使用安卓的包裹系统,这似乎是一个“辅助”编组技术。
    2. 使用自定义二进制格式(可能是删除标题信息的BMP样式)。
    3. 手动存储到XML文件中,使用XML解析器检索数据。

    现在,据我所知,XML序列化或parcelization在Android上并不真正向后兼容?XML的吸引力当然在于,这些持久性文件可以在常规文本编辑器中进行编辑。这让我处于一个困难的境地,因为我讨厌编写多余的代码。

    在这一点上,我非常倾向于第一个选项(即,位集被分割)。任何有经验的Java/Android程序员都愿意告诉我,我能期待这个如何执行?为了获得可接受的运行时性能,是否需要将位集扩展为布尔数组?当然,问题在于,即使是一个基本的基准测试也必须在dalvik-vm上运行,因为我不能期望sun的vm在x86上的性能与android在ARM上的性能相似。Android模拟器是如何工作的?它是位于x86主机之上的虚拟机,还是模拟ARM指令集并运行针对ARM的虚拟机?

    我希望这篇文章不会让每个人都困惑,因为它让我困惑。D

    2 回复  |  直到 14 年前
        1
  •  2
  •   Elliott Hughes    14 年前

    您听说序列化速度很慢,所以要使用XML吗?大声笑。

    您需要为自己编写一些实际的基准,将实际需要处理的位集类型(大与小、密集与稀疏,等等)序列化。我强烈推荐 http://code.google.com/p/caliper/ 写你的基准。 http://code.google.com/p/vogar/ 知道如何在Android设备上运行井径测试。

    正如我所说的 Designing for Performance ,仿真器行为为 没有什么 在性能方面类似于设备行为。你 需要 在你真正关心的性能最低的设备上进行测试。

        2
  •  0
  •   Emil    14 年前

    我认为第三个选项是最好的,因为在位集中,即使它在某些情况下占用的内存更少,如果以二进制模式存储,它也会浪费空间,例如:

    
    BitSet b=new BitSet();
    b.set(100000);
    

    在这种情况下,您只有一个集合位,但是当您以位图或序列化格式存储在文件中时,它只会为所有未设置的位浪费空间。Anroid的包裹系统我不知道它是如何工作的,所以我不能对它发表评论。

    如果您确定位不会是大数字,那么就使用二进制模式,否则就使用XML模式,或者只使用存储b.toString()的文本,并在需要时从文件中解析它。