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]);
        }

谢谢。

4

2 回答 2

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在他的网站上有一些很棒的资源。它们值得一读。这个关于性能的幻灯片/演示文稿值得一看。使用箭头键更改幻灯片。

编辑

如果没有听过格兰特的介绍,最初的幻灯片可能看起来没有那么有趣。然而,它确实在幻灯片 #43 周围变得非常有趣(带有具体的代码示例):http: //gskinner.com/talks/quick/#43

于 2012-08-03T18:01:29.323 回答
0

我认为没有什么好的方法可以避免使用循环。不过,可以进一步优化循环。

  1. 就像有人已经建议将数组长度读取到 var 一样,因此循环不必在每次迭代时检查长度。
  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);
    }
于 2012-08-06T15:35:30.110 回答