diff options
author | 2016-07-20 14:17:10 +0000 | |
---|---|---|
committer | 2016-07-20 15:01:55 +0000 | |
commit | b47f344508faa2d2ba8dc93a58546c0ebe9d6584 (patch) | |
tree | c8c540b0be07f6e43ca8c6b698484cb8994469d4 | |
parent | 9520447f0b743e70f81489b87235c0b77ba51366 (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.java | 6 |
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; |