2012-07-04 19 views
2

我正在尋找一種方法來改善Eclipse的SearchEngine類的運行時,或其他可以替代它的搜索技術。目前,我正在搜索給定項目源文件中的所有方法的所有引用。這項技術對較小的項目運行良好,但運行時間呈指數增長,在幾MB的項目上變得毫無用處。Eclipse JDT的替代或改進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; 
} 

} 

範圍,發動機,模式,參與者和請求者都是全局變量。

我目前沒有保存結果,因爲現在我擔心的是搜索的運行時間。直接掃描(遍歷每個源文件並保存所有參考實例)會更快嗎?有沒有辦法提升SearchEngine?

看起來好像我使用內置的Eclipse搜索(右鍵單擊method-> references->項目)的工作非常快,而不是此編程版本,但我可能是錯誤的。任何幫助表示讚賞。謝謝。

回答

2

不要以爲SearchEngine是爲了搜索所有方法的所有引用而設計的。我懷疑你的代碼有效地通過相同的源文件多次。

內置搜索的運行速度可能更快,可能是因爲您正在搜索僅有一種方法的引用。

這裏有一些關於SearchEngine內部的細節 - http://wiki.eclipse.org/JDT_Core_Programmer_Guide#Search_Engine - 這可能會讓你對發生的事情有所瞭解。

+0

感謝您的回覆。我知道我正在使用的這個搜索例程會多次遍歷相同的源代碼,這就是爲什麼我正在尋找替代方法。儘管內置搜索一次只能使用一種方法,但它看起來似乎比我得到的結果快得多(一個數量級)。我正在尋找的是一個替代方案,正如您所指出的那樣,SearchEngine很可能不是爲此目的而製作的。任何其他代碼搜索建議? – HJM

+0

我最終使用了ASTVisitor,它對你的推理起到了更好的作用。 – HJM