目前我正在编写一个脚本,我必须存储超过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个单词。
有没有更好/更快的方法来实现这一目标?
答案 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
更慢,如果是这样,转而使用赋值。