使用非常大的Javascript数组或对象

时间:2013-04-29 08:32:24

标签: javascript jquery performance optimization

目前我正在编写一个脚本,我必须存储超过1,250,000个对象。我在jQuery push()循环中使用each()函数,如下所示:

words.push({
  "page": pagenumber,
  "content": word,
  "hpos": $(this).attr("HPOS"),
  "vpos": $(this).attr("VPOS"),
  "width": $(this).attr("WIDTH"),
  "height": $(this).attr("HEIGHT")
});

在Chrome中,它会快速退出,在30到40秒之间,但在Internet Explorer中最多可能需要360秒。

这是一个装载旧报纸的项目,您可以从这些报纸中搜索文本。报纸在一个目录中,并动态加载。在这个测试中,我正在使用1926年10月的报纸,包含308页和超过1.250.000个单词。

有没有更好/更快的方法来实现这一目标?

1 个答案:

答案 0 :(得分:6)

  

有没有更好/更快的方法来实现这一目标?

是:在服务器上进行,而不是在浏览器中进行。这也有一个好处,你可以做一次并重用信息。

但由于某种原因假设不可能:

你可以做的第一件事就是停止进行数百万次不必要的函数调用,每次循环只执行$(this) 一次

.....each(function () {
    var $this = $(this);
    words.push({
        "page": pagenumber,
        "content": word,
        "hpos": $this.attr("HPOS"),
        "vpos": $this.attr("VPOS"),
        "width": $this.attr("WIDTH"),
        "height": $this.attr("HEIGHT")
    });
});

通常反复这样做并不是什么大问题(尽管我还是会避免这种情况),但如果你这样做了一次又一次......那么......

如果所有这些属性都是属性,那么你可以通过从中间删除jQuery来完全避免调用:

.....each(function () {
    words.push({
        "page": pagenumber,
        "content": word,
        "hpos": this.getAttribute("HPOS"),
        "vpos": this.getAttribute("VPOS"),
        "width": this.getAttribute("WIDTH"),
        "height": this.getAttribute("HEIGHT")
    });
});

jQuery的attr功能很棒,可以解决各种具有某些属性的跨浏览器麻烦,但我不认为这四种中的任何一种都需要特殊处理,即使在IE上也是如此,所以你可以使用DOM直接getAttribute

接下来的事情是,某些JavaScript引擎执行push的速度比分配到数组末尾要慢得多。这两个陈述做同样的事情:

myarray.push(entry);
// and
myarray[myarray.length] = entry;

但是其他引擎处理push的速度比分配快(或者更快)(毕竟,它是一个成熟的优化目标)。所以你可能会看看IE是否push更慢,如果是这样,转而使用赋值。