1 |
peierls |
1.1 |
import java.util.concurrent.*; |
2 |
|
|
import java.util.Random; |
3 |
|
|
|
4 |
|
|
public class TimeUnitLoops { |
5 |
|
|
|
6 |
|
|
static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom(); |
7 |
|
|
|
8 |
|
|
/** |
9 |
|
|
* False value allows aggressive inlining of cvt() calls from |
10 |
|
|
* test(). True value prevents any inlining, requiring virtual |
11 |
|
|
* method dispatch. |
12 |
|
|
*/ |
13 |
|
|
static final boolean PREVENT_INLINING = true; |
14 |
|
|
|
15 |
|
|
// The following all are used by inlining prevention clause: |
16 |
|
|
static int index = 0; |
17 |
|
|
static final int NUNITS = 100; |
18 |
|
|
static final TimeUnit[] units = new TimeUnit[NUNITS]; |
19 |
|
|
static { |
20 |
|
|
TimeUnit[] v = TimeUnit.values(); |
21 |
|
|
for (int i = 0; i < NUNITS; ++i) |
22 |
|
|
units[i] = v[rng.next() % v.length]; |
23 |
|
|
} |
24 |
|
|
|
25 |
|
|
public static void main(String[] args) throws Exception { |
26 |
|
|
long start = System.currentTimeMillis(); |
27 |
|
|
long s = 0; |
28 |
|
|
for (int i = 0; i < 100; ++i) { |
29 |
|
|
s += test(); |
30 |
|
|
if (s == start) System.out.println(" "); |
31 |
|
|
} |
32 |
|
|
long end = System.currentTimeMillis(); |
33 |
|
|
System.out.println("Time: " + (end - start) + " ms"); |
34 |
|
|
} |
35 |
|
|
|
36 |
|
|
static long test() { |
37 |
|
|
long sum = 0; |
38 |
|
|
int x = rng.next(); |
39 |
|
|
for (int i = 0; i < 1000000; ++i) { |
40 |
|
|
long l = (long)x + (long)x; |
41 |
|
|
sum += cvt(l, TimeUnit.SECONDS); |
42 |
|
|
sum += TimeUnit.MILLISECONDS.toMicros(l+2); |
43 |
|
|
sum += cvt(l+17, TimeUnit.NANOSECONDS); |
44 |
|
|
sum += cvt(l+42, TimeUnit.MILLISECONDS); |
45 |
|
|
x = LoopHelpers.compute4(x); |
46 |
|
|
} |
47 |
|
|
return sum + x; |
48 |
|
|
} |
49 |
|
|
|
50 |
|
|
static long cvt(long d, TimeUnit u) { |
51 |
|
|
if (PREVENT_INLINING) { |
52 |
|
|
u = units[index]; |
53 |
|
|
index = (index+1) % NUNITS; |
54 |
|
|
} |
55 |
|
|
|
56 |
|
|
return u.toNanos(d); |
57 |
|
|
} |
58 |
|
|
} |