0

C に似たマクロを含む入力ファイルを読み取る小さなプログラムがあります。処理は 2 つのパスで行われます。最初のパスはマクロ定義を検索して保存し、2 番目のパスはマクロ呼び出しを検索して展開/置換します。

これはすべてうまく機能しますが、時間がかかります。現在、これは私がそれを行う方法です:

foreach token in file:
    foreach macro in macroDefinitions:
        if token equals macro.name:
            expand()
        endif
    end foreach
endforeach

この疑似例では、'token' はソース ファイルからの単語であり、'macro' は最初のパスからのマクロ定義です。約 20,000 のマクロ定義と 1,800 の入力ファイルがあり、合計で約 600,000 行が処理されます (各行は n 個のトークンに分割されます)。これは、合計比較回数が (トークンの数) * (マクロ定義の数) であることを意味します。どうすればこれをスピードアップできますか? 私は何かを見逃していますか、それともこれらすべての比較を本当に行う必要がありますか?

追加情報として、トークンは String[] 配列の文字列であり、マクロはリストの ArrayList タイプのマクロ オブジェクトです。他の種類のデータ構造を使用してプロセスを高速化できますか?

4

5 に答える 5

0

マクロ定義の名前を含む を使用し、HashSetトークンごとに、それがセットに含まれていることを確認できます。

for(String token : token) {
    if(macroNamesSet.contains(token)) {
        expand();
    }
}

O(1)時間かかるcontainsメソッド。したがって、全体として、マクロ名のセットが作成されると、(トークンの数) 時間がかかります。

于 2013-04-16T10:43:40.653 に答える