使用非常大的Javascript数组或对象
目前,我正在编写一个脚本,其中必须存储1250000多个对象。我在jQuery使用非常大的Javascript数组或对象,javascript,jquery,performance,optimization,Javascript,Jquery,Performance,Optimization,目前,我正在编写一个脚本,其中必须存储1250000多个对象。我在jQueryeach()循环中使用push()函数,如下所示: words.push({ "page": pagenumber, "content": word, "hpos": $(this).attr("HPOS"), "vpos": $(this).attr("VPOS"), "width": $(this).attr("WIDTH"), "height": $(this).attr("HEIGHT"
each()
循环中使用push()
函数,如下所示:
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秒之间,但在InternetExplorer中可能需要360秒
这是一个项目,旧报纸加载,你可以搜索这些报纸的文本。报纸位于目录中,并动态加载。在这次测试中,我使用了1926年10月的报纸,共308页,超过1250000字
有没有更好/更快的方法来实现这一点
有没有更好/更快的方法来实现这一点
是:在服务器上执行,而不是在浏览器中。这还有一个优点,即您可以一次性完成并重用信息
但由于某种原因,假设这是不可能的:
您可以做的第一件事是停止进行数百万不必要的函数调用,只需对每个循环执行一次$(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")
});
});
通常反复做这件事没什么大不了的(尽管我还是会避免),但如果你做这件事有25万次
如果所有这些属性都是属性,那么可以通过将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;
但其他引擎处理推送的速度与分配的速度相同或更快(毕竟,这是一个成熟的优化目标)。所以你可以看看IE是否推得更慢,如果是这样的话,改用赋值法。你能给我们一些背景知识,说明你为什么要创建125万个对象的数组吗?你最好想想,如果您在浏览器中的JavaScript对象中确实需要1m+个条目。@zerkms:没有使用JavaScripts非类型数组预分配的概念,因为。我想不出向客户端数组添加这么多项的原因。我认为你需要解释你的理由,让我们对你的项目目标有更多的了解。您可能需要重新考虑您的设计。此外,关于编辑、加载和索引报纸,服务器肯定需要做一些工作。谢谢,这使事情加快了一点,但我想我会尝试一下node.js。试图让服务器完成所有的繁重工作,而不是浏览器。@T.J.Crowder不
myarray[myarray.length]=entry代码>创建稀疏数组?在这种情况下可能不是问题,但它可以更改某些应用程序的数组行为。@ultraviol3tlux:不,它不会。它只是在数组的末尾添加一个条目,就像push
那样。将值赋给length
使其变大(var a=[];a.length=10;
)会创建稀疏数组,但添加到数组末尾则不会。