使用字典优化文本替换的性能

时间:2019-05-17 20:11:10

标签: javascript for-loop replace while-loop tree

我正在为Firefox开发扩展程序。

总而言之,假设这是一个应用于很多错误页面的拼写检查器。

但这非常慢,因为步骤太多。

(1)我创建了一个TreeWalker,它仅过滤非空文本节点

var tree = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, {
  acceptNode: function(node) {
    if (node.parentNode.nodeName !== "SCRIPT" && node.nodeValue.trim().length > 0) {
      return NodeFilter.FILTER_ACCEPT;
    }
  }
}, false);

(2)一会儿循环浏览了TreeWalker

(3)在此while循环中,for循环使用复杂的RegEx

跳过字典(很大)
const dico = [
  ['suffix1','suffix2','correction'],
  ['','',''],
  ['','',''],
  // a lot of lines
];

(4)文本已替换

dl = dico.length;

function skim(){
  while (tree.nextNode()) {
    for (var i=0; i < dl ; i++) {
      var r1 = new RegExp("([a-zÀ-ÖÙ-öù-üœŒ]+)?(" + dico[i][0] + ")[-/·∙.•](" + dico[i][1] + ")[-/·∙.•]?(s)?(?![a-z])", "gi");
      tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(r1, dico[i][3]);
    }
  }
}

此外,我想使用另一个突出显示拼写错误的功能,这意味着在文本节点之间添加了很多元素节点。

我该如何优化呢? :)

目前,我发现的唯一解决方案是简化字典,但是我到此结束了。并用等效项替换TreeWalker,但速度更快。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是KostasX和Jonas Wilms的主张的更新。

那要快得多,因为它可以记住正则表达式,因此不必在每个节点上都重新创建它们。

另外,它异步迭代,以不阻塞UI。

function skim() {
  dicomap.map((replace_entry)=>{
    tree.currentNode.nodeValue = tree.currentNode.nodeValue.replace(replace_entry[0],replace_entry[mode]);
  });

  if(tree.nextNode()) setTimeout(skim);
}
skim();