2

目前我正在编写一个脚本,我必须存储超过 1,250,000 个对象。我push()在这样的 jQueryeach()循环中使用该函数:

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 字。

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

4

1 回答 1

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得更慢,如果是,请改用赋值。

于 2013-04-29T08:37:03.310 回答