在GWT中缓慢迭代JSONArray

8

我正在使用GWT构建一个应用程序,但是我遇到了严重的速度问题,尽管我认为应该很快。我有一个具有以下结构(但要大得多)数据的JSONObject:

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

我正在尝试遍历JSON对象,将每个节点对象的所有属性存储到一个数组列表中,其属性大小范围从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循环大约需要一分钟时间,这似乎太长了,我不知道如何改进它。这一分钟是在开发模式下,但我不知道编译后是否会更快。

您解析JSON结构的方式很好。一分钟对于大约800条记录来说有点长了。不过我可以保证在生产模式下性能良好(您应该实际尝试一下)。为了测试目的,您可以删除node.attributeArrayList.add()调用并查看它是否会影响性能。顺便问一下,在开发模式下您使用哪个浏览器? - Ümit
我之所以不使用生产模式,是因为在异步调用上出现了404错误。由于在开发模式下没有出现404错误,因此我一直在使用它。我寻求答案的过程表明可能是SOP问题,所以我已经把修复它放在了一边。 - aelnaiem
当我将其托管在本地主机上时,会出现404错误。当从我的项目目录中打开html文件时,我会得到一个(NS_ERROR_DOM_BAD_URI):访问受限URI被拒绝的代码:1012... 错误。 抱歉转移话题。 - aelnaiem
我建议您开一个新问题,详细说明生产模式错误的细节。 - sinelaw
我曾经在开发模式下观察到类似的性能问题,似乎遍历JSONArray和JSONObject大约需要半分钟来处理六百条记录。但在生产模式下运行同一应用程序就可以正常工作。我很想知道您是否已经找出了为什么在开发模式下运行如此缓慢的原因。 - Nigel_V_Thomas
显示剩余2条评论
3个回答

3

您尝试过使用覆盖层吗?

GWT编码基础- JavaScript 覆盖层类型

您可以很容易地创建覆盖层类型:

// 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对象要快得多。


0
你如何使用GWT?在IDE中吗? 根据我的经验,设置太多断点会减慢执行流程,你可以检查一下。 特别是当我在生产环境中看到它时,似乎没问题...

0

如果其他方法都失败了,你总可以用本地的Javascript编写并通过JSNI调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接