aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Jon Brandvein <brandjon@google.com>2016-07-20 14:17:10 +0000
committerGravatar John Cater <jcater@google.com>2016-07-20 15:01:55 +0000
commitb47f344508faa2d2ba8dc93a58546c0ebe9d6584 (patch)
treec8c540b0be07f6e43ca8c6b698484cb8994469d4
parent9520447f0b743e70f81489b87235c0b77ba51366 (diff)
Improve performance of absurdly large range()s
For instance, for a simple .bzl program that just iterates over a range of size 200M, the total running time drops from about two minutes to half a minute. -- MOS_MIGRATED_REVID=127942625
-rw-r--r--src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
index f02b58546e..a7d168dc87 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodLibrary.java
@@ -2032,13 +2032,17 @@ public class MethodLibrary {
if (step == 0) {
throw new EvalException(loc, "step cannot be 0");
}
- List<Integer> result = Lists.newArrayList();
+ ArrayList<Integer> result = Lists.newArrayList();
if (step > 0) {
+ int size = (stop - start) / step;
+ result.ensureCapacity(size);
while (start < stop) {
result.add(start);
start += step;
}
} else {
+ int size = (start - stop) / step;
+ result.ensureCapacity(size);
while (start > stop) {
result.add(start);
start += step;