我有一个3d文件解析器,但如果我有一个非常大的文件(大约3 MB),解析将非常慢。 (55秒)
如何加快速度?
我有一个简单的解析器:
InputStream fileIn = resources.openRawResource(resourceID);
BufferedReader buffer = new BufferedReader(new InputStreamReader(fileIn));
while ((line = buffer.readLine()) != null) {
StringTokenizer parts = new StringTokenizer(line, " ");
...
等
编辑1
使用AssetManager的新代码
AssetManager assetManager = context.getAssets();
InputStream fileIn = null;
try {
fileIn = assetManager.open(resourceID, AssetManager.ACCESS_RANDOM);
} catch (IOException e) {
Log.e("err0", ""+e);
}
BufferedReader buffer = new BufferedReader(new InputStreamReader(fileIn));
这个快一点,有3 MB的文件,我得到38秒。
谢谢, 莱斯利
答案 0 :(得分:0)
最好的办法是使用Android方法分析器来确定算法中运行速度最慢的方法。从那里,您可以尝试对这些方法进行改进(可能通过重用对象或删除不必要的操作等)。最后,再次测量您的代码,以确保您的改进实际上按照您的预期工作。不幸的是,优化代码没有“银弹”。
如果在单个方法中有很多慢代码,您还可以使用原始时间函数(如System.currentTimeMillis)来记录某些任务确定最慢的时间。
最后,正如猜测一样,我怀疑创建非常大的字符串或大量字符串可能是算法缓慢的一个原因。每次读取一行时,都会创建一个新字符串。然后,您通过标记它们来创建更多字符串。最终将由垃圾收集器收集所有这些对象,这需要额外的时间。也许你能做的就是将文件的原始字节读入一个重用的字节数组并对其进行处理。如果您提前知道文件的字符编码(或者甚至是最大行长度),这可能会显着缩短您的执行时间。
答案 1 :(得分:0)
就我个人而言,我会从你的移动应用程序中删除该parcer,并将其作为预处理工具,将3d网格写入平面二进制格式 - 除非您的应用程序是3D建模工具!这样,您就可以通过一个读取例程轻松加载数据(并上传到gpu)。