2011-11-25 22 views
0

我有3D文件解析器,但如果我有一個非常大的文件(大約3 MB)解析西港島線是非常慢的。 (55秒),的Android的OpenGL-ES 3D文件分析器的工作是很慢

我怎樣才能加快步伐?

我有一個簡單的解析器:

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

要做的是使用Android方法探查,以確定哪種方法在你的算法運行最慢的最好的事情。從那裏開始,您可以嘗試對這些方法進行改進(可能通過重用對象或刪除不必要的操作等)。最後,再次測量您的代碼,確保您的改進實際上按照您的預期工作。不幸的是,優化代碼沒有「銀彈」。

如果您在單一方法中有很多慢代碼,您還可以使用原始時間函數(如System.currentTimeMillis)記錄某些任務需要多長時間才能確定什麼是最慢的。

最後,正如一個猜測,我懷疑創造要麼非常大的字符串或者大量的字符串可能是你的算法緩慢的一個來源。每次你讀一行時,你都會創建一個新的字符串。然後,通過標記它們來創建更多的字符串。所有這些對象最終都會被垃圾收集器收集,這會花費額外的時間。也許你可以做的事情是將文件的原始字節讀入重用的字節數組,並對其進行處理。如果您提前知道文件的字符編碼(或者甚至是最大行長度),這可能會顯着縮短執行時間。

+0

您好賈斯汀!你可以給我一個示例如何使用字節作爲readline字符串?謝謝,Leslie – lacas

+0

這一切都取決於如何寫入文件。舉個例子,假設你知道一行可能的最大長度是200字節。然後,您可以從文件中一次讀取200個字節,並按字節處理數據以尋找換行符來終止您的行。然後你可以保留剩下的字節(比如說20),然後再讀取字節以再次填充緩衝區(現在爲180)。繼續這樣做直到處理完整個文件。再次,這只是一個理論,爲什麼你的解析器很慢。 –

+0

主要思想是避免使用字符串數據,如果你不需要的話。 –

0

個人而言,我會從你的移動應用程序刪除parcer,並把它作爲預處理工具,會寫你的3D網格的扁平二進制格式 - 除非你的應用程序是一個3D建模工具!這樣,您就可以輕鬆地使用單個讀取例程加載數據(並上傳到GPU)。