2011-08-25 85 views
8

我正在使用GWT構建應用程序,而且我正面臨着我認爲速度非常快的嚴重速度問題。我有下面的結構數據的JSONObject(但大得多):通過GWT中的JSONArray緩慢迭代

{"nodeData" : [ 
       { "name":"one", "attributes":["uno","dos"]}, 
       {"name":"two", "attributes":["tres"]} 
       ] 
} 

我試圖通過JSON對象進行迭代來存儲所有屬性在其中每個節點對象都有一個ArrayList,具有屬性大小從4到800

JSONObject JSONnode = nodeData.get(i).isObject(); 
Node node = new Node(JSONnode.get("name").toString(); 
JSONArray attributeArray = JSONnode.get("Attributes").isArray(); 
int attributeSize = attributeArray.size(); 


for(int j = 0; k < attributeSize; j++){ 
    node.attributeArrayList.add(attributeArray.get(j).toString(); 
} 

for循環,我執行走約一分鐘,這似乎太長了,我不知道如何改進它。一分鐘處於開發模式,但我不知道編譯它時會不會更快。

+0

解析JSON結構的方式很好。對於大約800條記錄,一分鐘聽起來有點多。不過,我可以保證在生產模式下性能良好(您應該嘗試使用它)。出於測試目的,您可以刪除node.attributeArrayList.add()調用並查看它是否會影響性能。順便說一句你在開發模式中使用哪種瀏覽器? –

+0

我不使用生產模式的原因是因爲我在異步調用中遇到404錯誤。由於我沒有在開發模式中獲得404,我只是一直使用它。我尋找答案表明它可能是一個SOP問題,所以我有點推動把它固定在一邊。 – aelnaiem

+0

404與SOP無關(因爲404意味着服務器已到達)。然而,很可能你使用的是絕對路徑,因爲web應用程序部署在服務器的ROOT處,所以絕對路徑工作在開發模式下,但不能在prod模式下使用非空的「上下文路徑」。最有可能的解決辦法是將您的路徑連接到'GWT.getHostPageBaseURL()',因此它與您的主機頁面「相對」,無論它在哪裏部署。 –

回答

0

你如何使用GWT?在IDE中? 以我的經驗,有太多的斷點放慢執行流程,可能你可以檢查? 特別是當我看到在生產中它似乎很好......

0

如果一切都失敗了,你可以隨時在原生Javascript中編寫並通過JSNI調用它。

3

您是否嘗試過使用覆蓋?

GWT Coding Basics - JavaScript Overlay Types

你可以很容易地創建覆蓋類型: -

// An overlay type 
class Customer extends JavaScriptObject { 

    // Overlay types always have protected, zero-arg ctors 
    protected Customer() { } 

    // Typically, methods on overlay types are JSNI 
    public final native String getFirstName() /*-{ return this.FirstName; }-*/; 
    public final native String getLastName() /*-{ return this.LastName; }-*/; 

    // Note, though, that methods aren't required to be JSNI 
    public final String getFullName() { 
    return getFirstName() + " " + getLastName(); 
    } 
} 

使用非常簡單,我認爲會比使用的JSONObject對象快得多。