diff options
author | Taras Tsugrii <ttsugrii@fb.com> | 2018-08-02 03:07:42 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-08-02 03:09:59 -0700 |
commit | bbb32f3f3c487de5e133b74026df72150974d7a5 (patch) | |
tree | c4e890a1d89a49630aa2f5800d5fbb9f85571d2c | |
parent | 2987ba80eea24051d3834b8ee00a5397ddd262c5 (diff) |
[Skylark] Improve Skylark interpreter performance.
According to JMH and JIT assembly generated for iterators and index
accesses, iterator methods like `hasNext` and `next` are not optimized
away and result in 3-4X slower execution.
Not using an iterator reduces Buck parse time for FB's internal Android
apps by 7%+.
Closes #5735.
PiperOrigin-RevId: 207073078
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java | 2 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java | 9 |
2 files changed, 7 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java index 541413f4c1..faf66bb907 100644 --- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java +++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java @@ -413,7 +413,7 @@ public final class EvalUtils { + "--incompatible_string_is_not_iterable=false to temporarily disable this check."); } - ImmutableList.Builder<String> builder = new ImmutableList.Builder<>(); + ImmutableList.Builder<String> builder = ImmutableList.builderWithExpectedSize(value.length()); for (char c : value.toCharArray()) { builder.add(String.valueOf(c)); } 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 87991d539c..44e6a67ae9 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 @@ -512,8 +512,9 @@ public final class FuncallExpression extends Expression { Map<String, Object> kwargs, MethodDescriptor method, Environment environment) { + ImmutableList<ParamDescriptor> parameters = method.getParameters(); ImmutableList.Builder<Object> builder = - ImmutableList.builderWithExpectedSize(method.getParameters().size() + EXTRA_ARGS_COUNT); + ImmutableList.builderWithExpectedSize(parameters.size() + EXTRA_ARGS_COUNT); boolean acceptsExtraArgs = method.isAcceptsExtraArgs(); boolean acceptsExtraKwargs = method.isAcceptsExtraKwargs(); @@ -524,9 +525,11 @@ public final class FuncallExpression extends Expression { // Positional parameters are always enumerated before non-positional parameters, // And default-valued positional parameters are always enumerated after other positional // parameters. These invariants are validated by the SkylarkCallable annotation processor. - for (ParamDescriptor param : method.getParameters()) { + // Index is used deliberately, since usage of iterators adds a significant overhead + for (int i = 0; i < parameters.size(); ++i) { + ParamDescriptor param = parameters.get(i); SkylarkType type = param.getSkylarkType(); - Object value = null; + Object value; if (argIndex < args.size() && param.isPositional()) { // Positional args and params remain. value = args.get(argIndex); |