【问题标题】:Alternative or Improvement to Eclipse JDT SearchEngineEclipse JDT 搜索引擎的替代或改进
【发布时间】:2012-07-04 01:30:28
【问题描述】:

我正在寻找一种方法来改进 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;
}

}

范围、引擎、模式、参与者和请求者都是全局变量。

我目前没有保存结果,因为现在我担心的是搜索的运行时间。直接扫描(遍历每个源文件并保存所有参考实例)会更快吗?有没有办法提升搜索引擎?

似乎我使用内置的 Eclipse 搜索(右键单击方法->引用->项目)工作得非常快,而不是这个程序版本,但我可能错了。任何帮助表示赞赏。谢谢你。

【问题讨论】:

    标签: java eclipse search eclipse-jdt


    【解决方案1】:

    不要认为 SearchEngine 旨在搜索所有方法的所有引用。我怀疑您的代码实际上多次遍历相同的源文件。

    内置搜索工作得更快可能是因为您在那里只搜索一种方法的引用。

    这里捕获了一些关于搜索引擎内部的细节 - http://wiki.eclipse.org/JDT_Core_Programmer_Guide#Search_Engine - 这可能会让您对正在发生的事情有所了解。

    【讨论】:

    • 感谢您的回复。我知道我正在使用的这个搜索例程将多次遍历相同的来源,这就是我寻找替代方案的原因。即使内置搜索一次只使用一种方法,它似乎仍然比我得到的结果快得多(一个数量级)。我正在寻找的是替代方案,正如您所指出的,搜索引擎很可能不是为此目的而设计的。还有其他代码搜索建议吗?
    • 我最终使用了 ASTVisitor,它更适合您的推理。
    猜你喜欢
    • 2012-01-29
    • 2013-01-01
    • 1970-01-01
    • 2017-05-15
    • 2013-02-23
    • 2010-11-26
    • 2014-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多