ICU-8167 Refined the timing a bit.

X-SVN-Rev: 29360
This commit is contained in:
Mark Davis 2011-01-25 17:53:00 +00:00
parent 4e843884ec
commit a2e6470823
2 changed files with 18 additions and 5 deletions

View File

@ -81,12 +81,18 @@ public final class Timer {
} }
public long timeIterations(Loop loop, Object... params) { public long timeIterations(Loop loop, Object... params) {
// Timing on Java is very tricky, especially when you count in garbage collection. This is a simple strategy for now, we might improve later.
// The current strategy is to warm up once, then time it until we reach the timingPeriod (eg 5 seconds), increasing the iterations each time
// At first, we double the iterations.
// Once we get to within 1/4 of the timingPeriod, we change to adding 33%, plus 1. We also remember the shortest duration from this point on.
// We return the shortest of the durations.
loop.init(params); loop.init(params);
System.gc(); System.gc();
start(); start();
loop.time(1); loop.time(1);
stop(); stop();
iterations = 2; iterations = 1;
long shortest = Long.MAX_VALUE;
while (true) { while (true) {
System.gc(); System.gc();
start(); start();
@ -94,9 +100,14 @@ public final class Timer {
stop(); stop();
if (duration >= timingPeriod) { if (duration >= timingPeriod) {
duration /= iterations; duration /= iterations;
return duration; return Math.min(duration, shortest);
} else if (duration >= timingPeriod / 4) {
duration /= iterations;
shortest = Math.min(duration, shortest);
iterations = (iterations * 4) / 3 + 1;
} else {
iterations = iterations * 2;
} }
iterations <<= 1;
} }
} }
} }

View File

@ -45,10 +45,12 @@ public class TrieMapTest extends TestFmwk {
super.init(); super.init();
if (unicodeTestMap.size() == 0) { if (unicodeTestMap.size() == 0) {
if (getInclusion() < 5) { if (getInclusion() < 5) {
logln("\tSmall version:\t to get more accurate figures and test for reasonable times, use -e5 or more"); logln("\tShort version, timing for 1s:\t to get more accurate figures and test for reasonable times, use -e5 or more");
t.setTimingPeriod(1*Timer.SECONDS); t.setTimingPeriod(1*Timer.SECONDS);
} else { } else {
t.setTimingPeriod((getInclusion() - 4)*Timer.SECONDS); int seconds = getInclusion();
logln("\tExhaustive version, timing for " + seconds + "s");
t.setTimingPeriod(seconds*Timer.SECONDS);
useSmallList = false; useSmallList = false;
} }