如何更快地匹配此文本?

时间:2011-08-27 22:48:21

标签: javascript performance algorithm optimization node.js

我正在为名字建立一个自动提示。当用户键入文本框时,它会命中服务器并运行它:

var names = [ list of 1000 names ]; //I have a list of 1000 names, this is static.
var query = 'alex';
var matched_names = [];

//This is when it gets slow....
names.forEach(function(name){
    if(name.indexOf(query) >= 0){
        matched_names.push(name);
    }
});

return matched_names;

如何让它更快?我正在使用Node.js

4 个答案:

答案 0 :(得分:7)

如果名称是静态的,则将此代码移至客户端并在那里运行。在服务器上运行这样的代码的唯一原因是数据源是否以某种方式动态。

执行此逻辑客户端将显着提高性能。

答案 1 :(得分:1)

你可能应该使用filter来代替,因为它是原生的:

var names = [ /* list of 1000 names */ ];
var query = 'alex';
var matched_names = names.filter(function(name) {
    return name.indexOf(query) > -1;
});
return matched_names;

答案 2 :(得分:1)

如果以排序顺序存储名称,则可以使用二进制搜索来查找排序顺序中的名称区域,该区域以用户目前已键入的名称片段开头,而不是检查所有名称一个人。

在一个使用相当奇怪的编程语言的系统上,我希望找到包含用户到目前为止在任何位置输入的内容的所有匹配项,通过复活http://en.wikipedia.org/wiki/Key_Word_in_Context,我得到了令人满意的结果,因为没有太多的实现工作。 (一旦进入大学,我搜索了一个物理的KWIC索引,从IBM打印机打印出来,然后作为文档绑定到这个目的。

答案 3 :(得分:1)

我建议你在客户端做这些事情并且更喜欢(现在)一个while循环而不是filter / forEach方法:

var names = [ /* list of 1000 names */ ]
,   query = 'alex'
,   i = names.length
,   matched_names = [];

while(i--){
  if(names[i].indexOf(query) > -1){
    matched_names.push(names[i]);
  }
}

return matched_names;

这将更快(即使本机支持filter / forEach)。请参阅此基准:http://jsperf.com/function-loops/4