diff options
author | Nathan Harmata <nharmata@google.com> | 2016-04-29 21:44:30 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2016-05-02 09:10:00 +0000 |
commit | 19350de0caaafbe3c6800c09d520d3ced82d87f9 (patch) | |
tree | aab5f7a8b5d26b0f78b36371861cc343793ad31a /src/main/java/com/google/devtools/common/options/OptionsParser.java | |
parent | 57cdd9af36b7dfb3f6bd5da26e0aff4fbc544a3a (diff) |
Memoize the OptionsData per BlazeCommand.
This saves the cost of (1) collecting all Options classes and (2) getting all their @Option annotations. Note that there is no savings on reflection costs, since that's already memoized internally by OptionsParser.
This saves ~250us per Blaze invocation.
--
MOS_MIGRATED_REVID=121153156
Diffstat (limited to 'src/main/java/com/google/devtools/common/options/OptionsParser.java')
-rw-r--r-- | src/main/java/com/google/devtools/common/options/OptionsParser.java | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/common/options/OptionsParser.java b/src/main/java/com/google/devtools/common/options/OptionsParser.java index e47d219e7d..fd6d91507f 100644 --- a/src/main/java/com/google/devtools/common/options/OptionsParser.java +++ b/src/main/java/com/google/devtools/common/options/OptionsParser.java @@ -72,7 +72,20 @@ public class OptionsParser implements OptionsProvider { private static final Map<ImmutableList<Class<? extends OptionsBase>>, OptionsData> optionsData = Maps.newHashMap(); - private static synchronized OptionsData getOptionsData( + /** + * Returns {@link OpaqueOptionsData} suitable for passing along to + * {@link #newOptionsParser(OpaqueOptionsData optionsData)}. + * + * This is useful when you want to do the work of analyzing the given {@code optionsClasses} + * exactly once, but you want to parse lots of different lists of strings (and thus need to + * construct lots of different {@link OptionsParser} instances). + */ + public static OpaqueOptionsData getOptionsData( + ImmutableList<Class<? extends OptionsBase>> optionsClasses) { + return getOptionsDataInternal(optionsClasses); + } + + private static synchronized OptionsData getOptionsDataInternal( ImmutableList<Class<? extends OptionsBase>> optionsClasses) { OptionsData result = optionsData.get(optionsClasses); if (result == null) { @@ -87,7 +100,8 @@ public class OptionsParser implements OptionsProvider { * ones. */ static Collection<Field> getAllAnnotatedFields(Class<? extends OptionsBase> optionsClass) { - OptionsData data = getOptionsData(ImmutableList.<Class<? extends OptionsBase>>of(optionsClass)); + OptionsData data = getOptionsDataInternal( + ImmutableList.<Class<? extends OptionsBase>>of(optionsClass)); return data.getFieldsForClass(optionsClass); } @@ -111,8 +125,16 @@ public class OptionsParser implements OptionsProvider { */ public static OptionsParser newOptionsParser( Iterable<? extends Class<? extends OptionsBase>> optionsClasses) { - return new OptionsParser( - getOptionsData(ImmutableList.<Class<? extends OptionsBase>>copyOf(optionsClasses))); + return newOptionsParser( + getOptionsDataInternal(ImmutableList.<Class<? extends OptionsBase>>copyOf(optionsClasses))); + } + + /** + * Create a new {@link OptionsParser}, using {@link OpaqueOptionsData} previously returned from + * {@link #getOptionsData}. + */ + public static OptionsParser newOptionsParser(OpaqueOptionsData optionsData) { + return new OptionsParser((OptionsData) optionsData); } private final OptionsParserImpl impl; |