2012-08-03 55 views
0

我正在使用动作脚本,我有一个数组与超过400.000字符串,现在我正在使用循环,并应用正则表达式来检查数组中的每个项目是否有效或不。如果它是有效的,我把这样的项目放在结果数组中。使用正则表达式从数组中获取项目

这个过程需要很长的时间,所以这是一个麻烦,因为所有的过程必须执行很多次。

我一直在想如果有任何其他方式(更快),我可以使用正则表达式应用到所有项目而不使用循环。

任何人都可以给我一个想法?

编辑

在这里,我附上使用的代码:

  var list:Array; 
     var list_total:Array = new Array; 
     var pattern:String = '^['+some_letters+']{'+n+'}$'; 
     var cleanRegExp:RegExp = new RegExp(pattern, 'gi'); 

     for (var i:int=0; i<_words.length; i++) { 
      list = _words[i].match(cleanRegExp); 
      if (list != null) 
       for (var j:int=0; j < list.length; j++) 
        list_total.push(list[j]); 
     } 

感谢。

+1

是的,有。如果您在此提供检查标准,我们可能会为您提供帮助。 – alinsoar 2012-08-03 17:05:56

+0

什么是正则表达式?你是否每次构造一个新的'RegExp'对象? – Staven 2012-08-03 17:06:35

+0

@Staven:我只构建一次RegExp。 – domoindal 2012-08-03 17:24:39

回答

0

这不是一个完整的答案,但可以帮助您优化您的代码。

尝试在循环中执行尽可能高效的操作。使用全局getTimer()函数计时,以便比较哪些方法最有效。在测量/比较时,您可能需要多次触发您的代码,以便这些差异显而易见。

// before test 
var startTime:Number = getTimer(); 
// do the expensive operation 
var endTime:Number = getTimer(); 
trace("operation took ", endTime - startTime, " milliseconds."); 

例如,一种改进是内部的for循环中,是无法查询阵列为它的长度的每个时间:

for (var i:int = 0; i < myArray.length; i++) 

相反,该长度在一个局部变量存储阵列的外并使用它:

var length:int = myArray.length; 
for (var i:int = 0; i < length; i++) 

区别是微妙的,但从本地变量访问长度将比从数组获取它快。

你可以测试的另一件事是正则表达式本身。尝试提出替代表达式,或使用替代功能。我不记得具体情况,但在一个项目中,我们确定(在我们的例子中)使用RegEx.test()方法是做这种比较的最快方法。这很可能与String.match()一样快 - 但除非你测量这些东西,否则你不会知道。

Grant Skinner在他的网站上有一些很棒的资源可用。他们值得阅读。这slide show/presentation on performance值得一看。使用箭头键更改幻灯片。

编辑

没有听到格兰特的介绍,最初的幻灯片可能不会看起来有趣。不过,它确实在幻灯片#43附近变得非常有趣(具体代码示例):http://gskinner.com/talks/quick/#43

+0

嗨,Sunil,至少我可以检查使用Regexp.test()操作比使用匹配要快得多。它提高了很多性能。谢谢。 – domoindal 2012-08-08 23:52:24

0

我不认为有任何避免使用循环的好方法。 虽然循环可以进一步优化。

  1. 就像有人已经建议阅读数组长度到一个变种,所以循环不必检查每个迭代的长度。
  2. 取代嵌套循环,使用concat将列表数组连接到lists_total。我不确定这是否更快。我想这取决于正则表达式得到多少匹配。

这里是修改后的代码。

var list:Array; 
    var list_total:Array = new Array; 
    var pattern:String = '^['+some_letters+']{'+n+'}$'; 
    var cleanRegExp:RegExp = new RegExp(pattern, 'gi'); 
    var wordsLength:int = _words.length; 
    for (var i:int=0; i<wordsLength; i++) { 
     list = _words[i].match(cleanRegExp); 
     if (list != null) 
      lists_total = lists_total.concat(list); 
    }