Android方法可以加快文件中的少量读数

时间:2015-06-05 10:34:16

标签: android multithreading performance nio

在我的应用程序中,我需要在应用程序启动时加载一些文件。我有6个不同的文件,其中包含int数组,我需要尽快读取它们。其中3个内容为80K整数,其他为200K整数

这是我用来从文件

读取int数组的方法
public static int[] loadByMappedBuffer(Context context, String filename) throws IOException{
    FileInputStream fis = context.openFileInput(filename);
    FileChannel ch = fis.getChannel();

    MappedByteBuffer mbuff = ch.map(MapMode.READ_ONLY, 0, ch.size());
    IntBuffer ibuff = mbuff.asIntBuffer();

    int[] array = new int[ibuff.limit()];
    ibuff.get(array);

    fis.close();
    ch.close();

    return array;
}

如您所见,我正在使用nio来读取数组。 这是测试结果,当我重新编写单个文件时,内容为80K整数

  • Sony Ericsson Experia,最佳时间为104毫秒,最差时间为270毫秒
  • Nexus 7的最佳时间为20.14毫秒,恶化为48.36
  • 三星Galaxy Note 10.1(2014年版),最佳时间为1.16毫秒,最差时间为5.82

因此对于单次阅读它可以正常工作,但是当我正在阅读所有6个文件(我在上面提到过)时,结果将会跟随

  • 索尼爱立信Experia,最佳时间为1396毫秒,最差时间为3324毫秒
  • 三星Galaxy Note 10.1(2014年版),最佳时间为58毫秒,最差时间为115毫秒

首先,我不明白为什么缓存在第一次阅读后没有开始,就像在PC上一样。

此时我有2个想法

  1. 找到一种更好的方式来读取文件(但据我所知,nio是从文件中读取基元的最快方法)
  2. 使用MT编程并将文件读数放入线程,这将加快这一点,但仅适用于具有多个核心的CPU的设备,我是对的?
  3. 我听说Async Task就像线程一样,它对我的​​目的有用吗?

    任何想法将不胜感激。提前致谢

1 个答案:

答案 0 :(得分:2)

线程不仅用于并行计算,它们还用于更好的用户体验,因此用户在后台执行操作时仍可以与应用程序进行交互。 AsyncTask非常好,但如果你的时间很短,正确编写的简单线程应该更快。

现在,如果应用程序加载文件,您可以部分(例如每个文件的10%)执行此操作,显示这些部分,并继续在后台加载其余部分。

我认为尝试更快地阅读是错误的方向,因为这是非常依赖硬件的。无论你怎么努力,一些设备都会很慢。考虑一下适用于所有情况的用户体验。

希望有所帮助