From 70997adc9c357694615bc195919a46ee6b0848b4 Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Thu, 17 Aug 2017 13:28:00 +0200 Subject: [PATCH] logic: greatly improved Java indexing performance * about 120% faster now * also fixed minor synchronization issues --- java_indexer/lib/java-symbol-solver-core.jar | Bin 260476 -> 260674 bytes java_indexer/lib/java-symbol-solver-logic.jar | Bin 14301 -> 14301 bytes java_indexer/lib/java-symbol-solver-model.jar | Bin 51532 -> 51532 bytes .../java/com/sourcetrail/JavaIndexer.java | 62 ++++++++++-------- .../SynchronizedJavaParserTypeSolver.java | 53 +++++++++++++++ .../parser/java/JavaEnvironmentFactory.cpp | 8 +++ 6 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java diff --git a/java_indexer/lib/java-symbol-solver-core.jar b/java_indexer/lib/java-symbol-solver-core.jar index 18562c83ab71b13dd07b43d957de9cd96d8ef3ba..3818af1e7809fd00cf5b01f261ce712ed5e6f4b1 100644 GIT binary patch delta 5346 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 E06fBgrT_o{ delta 5129 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 diff --git a/java_indexer/lib/java-symbol-solver-logic.jar b/java_indexer/lib/java-symbol-solver-logic.jar index 2a01daa8f5b6183437fae5c8ab4345c92c41d43b..219eebf0cb3dc244cd87bcaaa250196f08abae0c 100644 GIT binary patch delta 166 zcmcbce>a~uz?+$ci-CcIgMm3ka3ilZBQubm?9J!~qBl=r>|zBo6xr9afEky$1)0E% z=e!d*z>F#}8-6fjr|Lg$Fk_dYGT4~S4~)tn=0%!>fMh0bFew7ls-}ftdZuYLm=-sK Si1(Off%!kp^1*brc@Y3&3M&!- delta 166 zcmcbce>a~uz?+$ci-CcIgCRPHb0e=cBXd*^=VWh2HxRvf3S$>5n4!qNo(0Uf%q_?S zW<2MezyW4diP`Xj89P<~af2DV43!y~fyQlqU{nS%FVZ9gBr|z~NfDSQYY52mxtivU0kF){!E diff --git a/java_indexer/lib/java-symbol-solver-model.jar b/java_indexer/lib/java-symbol-solver-model.jar index 814428b1e44c860a3db6f5f3f36f162a069011aa..ebcb497d063dcb6bab03868e9bdb539e433aa39b 100644 GIT binary patch delta 927 zcmXX^T}YE*6n?jFKhFIrYf-r|tBax{!zee~vXK#EXqmyFR-zk4L9Uf;+FU>MLs6;i z9fe&OU6>^V$v2&Dy1BJK$f6NNUPM7yq8D`$-I&n#ozvCxyyrR3bIy18W>DUjLfKTJ8dkNutA?=}hv z35W?fLcO*vA+eHHZePt-*E9%Kd`J6VYxh}(kd1QsQe)<{RkSiDVSkt|;sS0NHwkaO1a1Xi-$fTAIG##)iZ5Ksak{ z$StP_911WVca)1^tD@@B$Mc-gE1@1s72onTwT3M^gXnK+DWG51)(XZeZF_OcoNEd9 z&YXSeFu3~l=)5*y z!t~_hW~^uj>v0q3P#VeFVeaK zp)nu4Uyq@_FM0vqQ_%q6uJOzG9`6J+PGDYi0`(m+)T1%X*%rSFeUbPLK=UN(iODW_ z*G}P_$dnV_n#38v*mMOQNYn$LOLPD_lODjgNu1d*efocI3!pC54tOtx*|Icdb*0g_ zn7#$N?^O?=G;9AY?kiq}JVT*IIDLi=JK zg%L&zuNP3qsB9QKDpJ9$kzaWE3-G&EZAk&q9m{M*Z%R8OdY2Xv$ z6B2TWy3HE{LIo|~vVyIwYTzr29c_P2U1u0V*2(BgbuFhYr{xh5`=j~-F5on_;N1KU z9S}NO*9b$ZcfOYt300Y`P;i)^3V_HPe`EOi4uk0hH-3|d76cWn(fS29)*qM!!dYtq zP8r>6lY{Z7tyBnG6_gJ@p5u&e5p@|WiY;H0E7^kGkA7=&9{t+Z7BF6J-Gy6b9SgX3 z`gjO$;d3d4&~v+e4G)eob8PMN?_xqyO9|OS-F;PbF{5TnJipMe=y#NX!O^Ef=hgmd zOiw&+!ir{~9yhTMrjV=};%?9V5^Qw%4c_S%3%k*u?Ac-*b%weCzlFSjM@IaBpGQ#N zKk9+^>rvEqhtI=17WM&dAG?I_u?|4PIOc`NQQsOtJsiQD&Cx5+7m8j7terqTKG6y9 zni$Rr#q97_$4>)BCd+7lydL;WydBV2AQ@^j*N!8QgIwgSXIU5rf$iMLm$iHM}`Dw9n@-{%{^Y;X~g04^z>% diff --git a/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java b/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java index 8153d876..424e4e56 100644 --- a/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java +++ b/java_indexer/src/main/java/com/sourcetrail/JavaIndexer.java @@ -3,25 +3,25 @@ package com.sourcetrail; import java.io.File; import java.io.IOException; import java.io.StringReader; -import java.lang.String; import java.util.HashMap; import java.util.Map; -import com.github.javaparser.ast.CompilationUnit; -import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.JavaParser; import com.github.javaparser.ParseProblemException; import com.github.javaparser.Position; import com.github.javaparser.Problem; import com.github.javaparser.Range; +import com.github.javaparser.ast.CompilationUnit; +import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.symbolsolver.javaparser.Navigator; import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.JarTypeSolver; -import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver; +import com.sourcetrail.typesolver.SynchronizedJavaParserTypeSolver; + public class JavaIndexer { private static Map typeSolvers = new HashMap<>(); @@ -37,36 +37,40 @@ public class JavaIndexer CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); combinedTypeSolver.add(new ReflectionTypeSolver()); - for (String path: classPath.split("\\;")) + + synchronized (typeSolvers) { - if (typeSolvers.containsKey(path)) + for (String path: classPath.split("\\;")) { - combinedTypeSolver.add(typeSolvers.get(path)); - } - else - { - TypeSolver typeSolver = null; - - if (path.endsWith(".jar")) + if (typeSolvers.containsKey(path)) { - try - { - typeSolver = new JarTypeSolver(path); - } - catch (IOException e) - { - System.out.println("unable to add jar file: " + path); - } + combinedTypeSolver.add(typeSolvers.get(path)); } - else if (!path.isEmpty()) + else { - typeSolver = new JavaParserTypeSolver(new File(path)); - } - - if (typeSolver != null) - { - typeSolvers.put(path, typeSolver); - combinedTypeSolver.add(typeSolver); + TypeSolver typeSolver = null; + + if (path.endsWith(".jar")) + { + try + { + typeSolver = new JarTypeSolver(path); + } + catch (IOException e) + { + System.out.println("unable to add jar file: " + path); + } + } + else if (!path.isEmpty()) + { + typeSolver = new SynchronizedJavaParserTypeSolver(new File(path)); + } + + if (typeSolver != null) + { + typeSolvers.put(path, typeSolver); + combinedTypeSolver.add(typeSolver); + } } } } diff --git a/java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java b/java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java new file mode 100644 index 00000000..b1dae652 --- /dev/null +++ b/java_indexer/src/main/java/com/sourcetrail/typesolver/SynchronizedJavaParserTypeSolver.java @@ -0,0 +1,53 @@ +package com.sourcetrail.typesolver; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import com.github.javaparser.symbolsolver.model.declarations.ReferenceTypeDeclaration; +import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; +import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; + +public class SynchronizedJavaParserTypeSolver extends JavaParserTypeSolver +{ + private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private Map> solvedTypes = new HashMap<>(); + + public SynchronizedJavaParserTypeSolver(File srcDir) + { + super(srcDir); + } + + @Override + public SymbolReference tryToSolveType(String name) + { + SymbolReference solvedType = SymbolReference.unsolved(ReferenceTypeDeclaration.class); + + { + lock.readLock().lock(); + if (solvedTypes.containsKey(name)) + { + solvedType = solvedTypes.get(name); + } + lock.readLock().unlock(); + } + + if (!solvedType.isSolved()) + { + solvedType = super.tryToSolveType(name); + + if (solvedType.isSolved()) + { + lock.writeLock().lock(); + if (!solvedTypes.containsKey(name)) + { + solvedTypes.put(name, solvedType); + } + lock.writeLock().unlock(); + } + } + + return solvedType; + } +} diff --git a/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp b/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp index 7dd4b769..488a4f16 100644 --- a/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp +++ b/src/lib_java/data/parser/java/JavaEnvironmentFactory.cpp @@ -53,6 +53,14 @@ void JavaEnvironmentFactory::createInstance(std::string classPath, std::string& std::string classPathOption = "-Djava.class.path=" + classPath; options[0].optionString = const_cast(classPathOption.c_str()); options[1].optionString = const_cast("-Xms64m"); + + // use these options to enable profiling in VisualVM + //options[2].optionString = const_cast("-Dcom.sun.management.jmxremote"); + //options[3].optionString = const_cast("-Dcom.sun.management.jmxremote.port=9010"); + //options[4].optionString = const_cast("-Dcom.sun.management.jmxremote.local.only=false"); + //options[5].optionString = const_cast("-Dcom.sun.management.jmxremote.authenticate=false"); + //options[6].optionString = const_cast("-Dcom.sun.management.jmxremote.ssl=false"); + if (optionCount == 3) { options[2].optionString = const_cast(maximumMemoryOprionString.c_str());