2

Eclipse の SearchEngine クラスの実行時間を改善する方法、またはそれに代わる別の検索手法を探しています。現在、特定のプロジェクトのソース ファイル内のすべてのメソッドのすべての参照を検索しています。この手法は小規模なプロジェクトでは問題なく実行できますが、実行時間は指数関数的に増加し、数 MB を超えるプロジェクトでは役に立たなくなります。

メソッド参照を見つけるために使用している現在のコードは次のとおりです。

public void processProject(IJavaProject javaProject) throws JavaModelException{
    initializeEngine(javaProject);
    for(IPackageFragment pkg : javaProject.getPackageFragments()){
        if(pkg.getKind() == IPackageFragmentRoot.K_SOURCE){
            for(ICompilationUnit unit : pkg.getCompilationUnits()){
                System.out.println("Unit: " + unit.getElementName());
                for(IType type : unit.getTypes()){
                    for(IMethod method : type.getMethods()){
                        //getReferenceMatches(method, javaProject);
                        searchFor(method);
                    }
                }
            }
        }
    }
}
public void initializeEngine(IJavaProject searchIn) throws JavaModelException{
    ArrayList<IPackageFragmentRoot> roots = new ArrayList<IPackageFragmentRoot>();
    for(IPackageFragmentRoot root : searchIn.getPackageFragmentRoots()){
        if(root.getKind() == IPackageFragmentRoot.K_SOURCE)
            roots.add(root);
    }
    IJavaElement[] elems = new IJavaElement[roots.size()];
    elems =  roots.toArray(elems);

    scope = SearchEngine.createJavaSearchScope(elems);


    engine = new SearchEngine();
    participants = new SearchParticipant[]{SearchEngine.getDefaultSearchParticipant()};


}
//search for methods, or other element type
public void searchFor(IJavaElement elem){
    requestor = new SimpleRequestor();
    pattern = SearchPattern.createPattern(elem, IJavaSearchConstants.REFERENCES);
    try{
        engine.search(pattern, participants, scope, requestor, null);
    }catch(CoreException e){
        e.printStackTrace();
    }
}
class SimpleRequestor extends SearchRequestor{
private ArrayList<SearchMatch> matches;

public SimpleRequestor(){
    super();
    matches = new ArrayList<SearchMatch>();
}
@Override
public void acceptSearchMatch(SearchMatch match) throws CoreException {
    if(match.getAccuracy() == SearchMatch.A_ACCURATE);
        matches.add(match);
}

public ArrayList<SearchMatch> getMatches(){
    return matches;
}

}

スコープ、エンジン、パターン、参加者、およびリクエスターはすべてグローバル変数です。

現在、私が心配しているのは検索の実行時間だけなので、現在は結果を保存していません。ストレート スキャン (各ソース ファイルを実行し、すべての参照インスタンスを保存する) の方が速くなりますか? SearchEngine をブーストする方法はありますか?

組み込みの Eclipse 検索 (メソッド -> 参照 -> プロジェクトを右クリック) を使用すると、このプログラム バージョンとは対照的に非常に高速に動作するように見えますが、間違っている可能性があります。どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

2

SearchEngineがすべてのメソッドのすべての参照を検索するように設計されているとは思わないでください。あなたのコードは同じソースファイルを効果的に何度も調べているのではないかと思います。

組み込みの検索は、おそらく1つのメソッドのみの参照を検索しているため、より高速に機能します。

SearchEngineの内部( http://wiki.eclipse.org/JDT_Core_Programmer_Guide#Search_Engine )についてここでキャプチャされた詳細がいくつかあります。これにより、何が起こっているかについての洞察が得られる場合があります。

于 2012-07-04T04:12:39.110 に答える