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.");

たとえば、1つの改善点はforループ内にあり、毎回配列の長さを照会しないことです。

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

代わりに、配列の外部のローカル変数に長さを格納し、それを使用します。

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

違いは微妙ですが、ローカル変数から長さにアクセスする方が、配列から長さにアクセスするよりも高速です。

テストできるもう1つのことは、正規表現自体です。別の表現を考え出すか、別の機能を使用してみてください。詳細は思い出せませんが、あるプロジェクトでは(この場合)、この方法を使用するRegEx.test()ことがこのような比較を行うための最速の方法であると判断しました。これは同じくらい速いかもしれString.match()ません-しかし、あなたがこれらのものを測定しない限り、あなたは知りません。

Grant Skinnerは、彼のサイトで利用できるすばらしいリソースをいくつか持っています。それらは読む価値があります。このスライドショー/パフォーマンスに関するプレゼンテーションは一見の価値があります。スライドを変更するには、矢印キーを使用します。

編集

グラントのプレゼンテーションを聞かなければ、最初のスライドはそれほど面白くないように思われるかもしれません。ただし、スライド#43の周りで(具体的なコード例を使用して)非常に興味深いものになります:http://gskinner.com/talks/quick/#43

于 2012-08-03T18:01:29.323 に答える
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);
    }
于 2012-08-06T15:35:30.110 に答える