Javascript在大型字典中循环会产生无响应的脚本
我正在制作一个firefox插件,在html文本中添加单词和其他单词。这段代码是有效的,但是当遍历一个庞大的字典时,我得到了一个无响应的脚本错误 提高这个循环速度的最佳方法是什么 将字典拆分为更小的对象?还是设定一个新的目标Javascript在大型字典中循环会产生无响应的脚本,javascript,dictionary,firefox-addon,Javascript,Dictionary,Firefox Addon,我正在制作一个firefox插件,在html文本中添加单词和其他单词。这段代码是有效的,但是当遍历一个庞大的字典时,我得到了一个无响应的脚本错误 提高这个循环速度的最佳方法是什么 将字典拆分为更小的对象?还是设定一个新的目标 var brands={“manykeys”:“manyvalue”}; 函数replaceWord(){ 对于(var关键品牌){ htmlreplace(键,键+”(“+品牌[键]+”); } } 函数htmlreplace(a,b,element){ 如果(!elem
var brands={“manykeys”:“manyvalue”};
函数replaceWord(){
对于(var关键品牌){
htmlreplace(键,键+”(“+品牌[键]+”);
}
}
函数htmlreplace(a,b,element){
如果(!element)element=document.body;
var节点=element.childNodes;
对于(var n=0;n我没有尝试过,但这样做可能会奏效:
function replaceWord(){
for (var key in brands){
(function(key) {
setTimeout(function() {
htmlreplace(key, key + " (" + brands[key] + ")");
}, 0);
})(key);
}
}
我们的想法是,当浏览器有时间的时候,您可以推迟替换,而不是单独执行,让浏览器在思考时冻结。需要考虑一些因素。这在很大程度上取决于您是否可以更改。您可以做的一个更大的改进是使用数组而不是键/值对象。
var brands = [
['manykeys0000','manyvalues0000'],
['manykeys0001','manyvalues0001'],
['manykeys0002','manyvalues0002'],
['manykeys0003','manyvalues0003'],
['manykeys0004', ...
];
function replaceWord(){
var i, n = brands.length;
for (i = 0; i < n; ++i) {
htmlreplace(brands[i][0], brands[i][0] + " (" + brands[i][1] + ")");
}
}
Chrome和Firefox上的快速基准测试相结合,速度提高了30-40%
要测试的其他编辑:
将var r=new RegExp(a,'g');
移动到replaceWord()
,并将其作为第一个参数传递到htmlreplace()
,而不是a
function replaceWord(){
var i, n = brands.length;
for (i = 0; i < n; ++i) {
var r = new RegExp(brands[i][0], 'g');
htmlreplace(r, brands[i].join(' (') + ')', elem);
}
}
实现自定义setZeroTimeout()
,但不确定它将如何影响您的案例
除此之外,请使用浏览器中的分析工具,例如,它可能更适合您在代码中所做的工作。代码中的瓶颈不是字典大小,除非它确实很大,而是DOM遍历
获取一次文本节点,然后使用它们
var textnodes=$x(“//text()”,document.body)
函数$x(p,上下文){
如果(!context)context=文档;
var i,arr=[],xpr=document.evaluate(p,context,null,XPathResult.UNORDERED\节点\快照\类型,null);
对于(i=0;item=xpr.snapshotItem(i);i++)arr.push(item);
返回arr;
}
你应该会看到速度有了相当大的提高。我强烈怀疑是正则表达式减慢了速度。在没有它的情况下试试看速度差异。呃。Chrome mangling可能不太适合Firefox插件。谢谢。我想知道我的字典是否太大,因为我的代码仍然冻结。但这是一个很好的答案.
var body = document.body;
...
htmlreplace(brands[i][0], brands[i][0] + " (" + brands[i][2] + ")", body);
function htmlreplace(a, b, element) {
var nodes = element.childNodes, len = nodes.length;
for (var n=0; n < len; ++n) {
function replaceWord(){
var i, n = brands.length;
for (i = 0; i < n; ++i) {
var r = new RegExp(brands[i][0], 'g');
htmlreplace(r, brands[i].join(' (') + ')', elem);
}
}
window.postMessage();