diff options
author | michajlo <michajlo@google.com> | 2017-10-06 23:51:10 +0200 |
---|---|---|
committer | Klaus Aehlig <aehlig@google.com> | 2017-10-07 11:07:24 +0200 |
commit | 5f39475bb51f48182180e34e4310edb650bea462 (patch) | |
tree | 5871871083d066c96e4cd23e267acda933c9f01e /src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | |
parent | 38da0c2e6e082964e32e8646439cdec7cd50808f (diff) |
Reduce iterator usage on hot code paths
Micro-optimize a few hot code paths which have a habit of iterating over short O(1)-access
lists.
RELNOTES: None
PiperOrigin-RevId: 171347524
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java index 133cc00fda..1b943ece94 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java @@ -192,11 +192,11 @@ public final class FuncallExpression extends Expression { private final Expression function; - private final List<Argument.Passed> arguments; + private final ImmutableList<Argument.Passed> arguments; private final int numPositionalArgs; - public FuncallExpression(Expression function, List<Argument.Passed> arguments) { + public FuncallExpression(Expression function, ImmutableList<Argument.Passed> arguments) { this.function = Preconditions.checkNotNull(function); this.arguments = Preconditions.checkNotNull(arguments); this.numPositionalArgs = countPositionalArguments(); @@ -679,7 +679,10 @@ public final class FuncallExpression extends Expression { // or star arguments, because the argument list was already validated by // Argument#validateFuncallArguments, as called by the Parser, // which should be the only place that build FuncallExpression-s. - for (Argument.Passed arg : arguments) { + // Argument lists are typically short and functions are frequently called, so go by index + // (O(1) for ImmutableList) to avoid the iterator overhead. + for (int i = 0; i < arguments.size(); i++) { + Argument.Passed arg = arguments.get(i); Object value = arg.getValue().eval(env); if (arg.isPositional()) { posargs.add(value); |