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