2011-02-02 49 views
3

我有一個靜態10K文件,每行有一個字。我需要創建一個包含所有單詞的String []數組。我有兩個選擇:訪問靜態最終性能

  1. 我手工創建一個靜態最終的String []字和硬編碼在我的代碼的所有單詞。
  2. 在啓動時,加載文件,解析它並創建一個包含所有單詞的靜態String []單詞數組。

現在,我的問題是,這一切都完成後,從陣列1(注意最終關鍵字)明顯加快從陣列2(無final關鍵字accesing一個字一個字,因爲我們加載在運行時的話)。理論上它有所作爲?我們在這裏專門討論Android,而不是Java。但我對這兩種情況都感興趣。

+0

爲什麼不讓數組2最終? – 2011-02-02 20:44:23

+0

難道你沒有辦法在不同的設備上嘗試/基準測試嗎?考慮到新版本(以及新的vm版本)推出的速度,我認爲你不應該對這件事感到困擾 - 只需要按照你喜歡的方式進行編碼即可。 – foxx1337 2011-02-02 20:44:58

回答

2

通用的Java:

存在用於在JVM數組初始化沒有字節碼,所以編譯器最終產生用於每一個數組項,其漲大的個體代碼的賦值語句。有關更多信息,請參閱here

根據您擁有的數據量,從文件中加載值是最有效的方案。數組是否被聲明爲final是無關緊要的,因爲字符串本身是不可變的。

機器人:

的DVM通過添加用於初始化數組的指令在JVM上得到改善。所以你沒有相同的代碼膨脹問題。

也就是說,從文件加載東西可能是最靈活的方法。如果正確完成,您可以根據需要從多個文件加載值,即使是在Internet上。

0

我不認爲有明顯的差異。當你將訪問他們,他們兩個人將只是2字符串數組,所以......

0

我相信你可以標記關鍵字爲靜態或最終,如果你在構造函數中分配給它。所以,只要確保您在靜態類的構造函數中讀取了該文件即可。 (我不是100%確定Java具有靜態構造函數,但在C#中這是有效的,而且兩者往往非常相似)。

即使你不能做這個伎倆,我仍然會閱讀10k文件。讀一個字符串[]永遠不會很貴。並且任何編譯器通常對標記爲final的成員所做的任何優化技巧都可以在運行時由Java JITTER完成,一旦它注意到字符串[]不再被更改。

0

製作數組最終不會使其元素最終。與C++相比,這是Java的缺點之一。唯一的實際效果是使用優化器和混淆器。用你所描述的,我很確定沒有明顯的差異。