Альтернатива или улучшение Eclipse JDT SearchEngine

Я ищу способ либо улучшить время выполнения класса Eclipse SearchEngine, либо другой метод поиска, который мог бы его заменить. В настоящее время я ищу все ссылки на ВСЕ методы в исходных файлах данного проекта. Этот метод отлично работает для небольших проектов, но время выполнения увеличивается экспоненциально и становится бесполезным для проектов размером более нескольких МБ.

Текущий код, который я использую для поиска ссылок на методы:

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

}

объем, механизм, шаблон, участники и запросчик — все это глобальные переменные.

В настоящее время я не сохраняю результаты, потому что сейчас меня волнует только время выполнения поиска. Будет ли прямое сканирование (прохождение по каждому исходному файлу и сохранение всех эталонных экземпляров) быстрее? Есть ли способ повысить поисковую систему?

Кажется, если я использую встроенный поиск Eclipse (правый клик по методу->ссылки->проект) работает очень быстро, в отличие от этой программной версии, но я могу ошибаться. Любая помощь приветствуется. Спасибо.


person HJM    schedule 04.07.2012    source источник


Ответы (1)


Не думайте, что SearchEngine был разработан для поиска всех ссылок на все методы. Я подозреваю, что ваш код эффективно просматривает одни и те же исходные файлы несколько раз.

Встроенный поиск работает быстрее, возможно потому, что вы ищете там ссылки только на один метод.

Здесь собраны некоторые подробности о внутреннем устройстве SearchEngine — http://wiki.eclipse.org/JDT_Core_Programmer_Guide#Search_Engine - что может дать вам некоторое представление о том, что происходит.

person Deepak Azad    schedule 04.07.2012
comment
Спасибо за ответ. Я понимаю, что эта процедура поиска, которую я использую, будет проходить через одни и те же источники несколько раз, и поэтому я ищу альтернативу. Несмотря на то, что встроенный поиск использует только один метод за раз, он все же кажется намного быстрее (на порядок), чем результаты, которые я получаю. То, что я ищу, является альтернативой этому, и, как вы указали, SearchEngine, скорее всего, не был создан для этой цели. Любые другие предложения по поиску кода? - person HJM; 05.07.2012
comment
Я закончил тем, что использовал ASTVisitor, он работает намного лучше для ваших рассуждений. - person HJM; 09.07.2012