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

时间:2010-07-31 02:47:06

标签: java android xml serialization bitmap

我的应用程序要求我在Android平台上存储多组位以及一些附带的元数据(现在只读)。现在显然我可以实现Serializable接口,但我听说它在Android上非常慢(我可以想象必须对自定义VM和编译器做一些事情,使得这样的反射功能效率低下)。 我应该:

  1. 使用Android的Parcel系统,这似乎是一种“辅助”编组技术。
  2. 使用自定义二进制格式(可能是带有标题信息的BMP样式)。
  3. 手动存储到XML文件中,使用XML解析器检索数据。
  4. 根据我的理解,XML序列化或parcelization在Android上并不真正向后兼容? XML的吸引力当然是可以在常规文本编辑器中编辑这些持久文件。这让我处于困境,因为我讨厌编写多余的代码。

    此时我非常倾向于第一个选项(即bitset被包裹)。任何有经验的Java / Android程序员都会关心告诉我,我可以期待它的表现如何?我是否必须将bitset扩展为布尔数组才能获得可接受的运行时性能?当然,问题在于,即使是基本的基准也必须在Dalvik VM上运行,因为我不能指望x86上的Sun的VM与ARM上的Android具有相似的性能。 Android模拟器如何工作?它是x86主机上的VM还是模拟ARM指令集并运行针对ARM的VM?

    我希望这篇ADD帖子并不会让所有人感到困惑,因为它让我很困惑。 :d

2 个答案:

答案 0 :(得分:2)

你听说过序列化很慢的谣言,所以你要使用XML吗?洛尔。

你需要自己写一些实际的基准测试,序列化你实际需要处理的各种位集(大型与小型,密集型与稀疏型等)。我强烈建议您http://code.google.com/p/caliper/撰写基准。 http://code.google.com/p/vogar/知道如何在Android设备上运行卡尺基准测试。

正如我在Designing for Performance所说的那样,在性能方面,模拟器行为 nothing 就像设备行为一样。你需要来测试你真正关心的性能最低的设备。

答案 1 :(得分:0)

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


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

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

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