Android 种加快文件读取速度的方法
Android ways to speed up few readings from files
在我的应用程序中,我需要在应用程序启动时加载一些文件。我有 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 ints
- 索尼爱立信 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个想法
- 找到一种更好的读取文件的方法(但据我所知,nio 是从文件中读取基元的最快方法)
- 使用 MT 编程并将文件读取放到线程中,这将加快速度,但仅适用于 CPU 具有多个内核的设备,对吗?
我听说 Async Task 有点像线程,它对我的目的有帮助吗?
任何想法将不胜感激。提前致谢
线程不仅用于并行计算,它们还用于更好的用户体验,因此用户仍然可以在应用程序在后台执行操作时与应用程序交互。
AsyncTask 非常好,尽管如果您的时间不够,正确编写的简单线程应该会更快。
现在,如果应用加载文件,您可以分段加载(例如每个文件的 10%),显示这些部分,然后在后台继续加载其余部分。
我认为尝试更快地阅读是错误的方向,因为这非常依赖于硬件。无论您多么努力,有些设备都会很慢。考虑一个适用于所有情况的用户体验。
希望对您有所帮助
在我的应用程序中,我需要在应用程序启动时加载一些文件。我有 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 ints
- 索尼爱立信 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个想法
- 找到一种更好的读取文件的方法(但据我所知,nio 是从文件中读取基元的最快方法)
- 使用 MT 编程并将文件读取放到线程中,这将加快速度,但仅适用于 CPU 具有多个内核的设备,对吗?
我听说 Async Task 有点像线程,它对我的目的有帮助吗?
任何想法将不胜感激。提前致谢
线程不仅用于并行计算,它们还用于更好的用户体验,因此用户仍然可以在应用程序在后台执行操作时与应用程序交互。 AsyncTask 非常好,尽管如果您的时间不够,正确编写的简单线程应该会更快。
现在,如果应用加载文件,您可以分段加载(例如每个文件的 10%),显示这些部分,然后在后台继续加载其余部分。
我认为尝试更快地阅读是错误的方向,因为这非常依赖于硬件。无论您多么努力,有些设备都会很慢。考虑一个适用于所有情况的用户体验。
希望对您有所帮助