|
1 | 1 | describe("Runtime exposes", function () { |
2 | 2 | it("__time a low overhead, high resolution, time in ms.", function () { |
3 | | - // Try to get the times using Date.now and __time and compare the results, expect them to be somewhat "close". |
4 | | - // Sometimes GC hits after Date.now is captured but before __time or the vice-versa and the test fails, |
5 | | - // so we are giving it several attempts. |
6 | | - for (var i = 0; i < 5; i++) { |
7 | | - try { |
8 | | - var dateTimeStart = Date.now(); |
9 | | - var timeStart = __time(); |
10 | | - var acc = 0; |
11 | | - var s = android.os.SystemClock.elapsedRealtime(); |
12 | | - for (var i = 0; i < 1000; i++) { |
13 | | - var c = android.os.SystemClock.elapsedRealtime(); |
14 | | - acc += c - s; |
15 | | - s = c; |
16 | | - } |
17 | | - var dateTimeEnd = Date.now(); |
18 | | - var timeEnd = __time(); |
19 | | - var dateDelta = dateTimeEnd - dateTimeStart; |
20 | | - var timeDelta = timeEnd - timeStart; |
21 | | - var tolerance = Math.max(10, dateDelta * 0.5); |
22 | | - expect(timeDelta > 0).toBe(true); |
23 | | - expect(Math.abs(dateDelta - timeDelta) < tolerance).toBe(true); |
24 | | - break; |
25 | | - } catch (e) { |
26 | | - if (i == 4) { |
27 | | - throw e; |
28 | | - } |
| 3 | + // Compare the Date.now and __time deltas over the same interval and expect |
| 4 | + // them to be somewhat "close". A GC pause or scheduler preemption landing |
| 5 | + // between the capture of the two clocks skews a single measurement, so the |
| 6 | + // window is kept wide enough for the proportional tolerance to absorb |
| 7 | + // realistic pauses, and the measurement is retried a few times with the |
| 8 | + // expectation only recorded once (jasmine expectations don't throw, so a |
| 9 | + // try/catch based retry would record the failed attempts anyway). |
| 10 | + var attempts = 5; |
| 11 | + var dateDelta, timeDelta, tolerance; |
| 12 | + var ok = false; |
| 13 | + |
| 14 | + for (var attempt = 0; attempt < attempts && !ok; attempt++) { |
| 15 | + var dateTimeStart = Date.now(); |
| 16 | + var timeStart = __time(); |
| 17 | + |
| 18 | + while (Date.now() - dateTimeStart < 50) { |
| 19 | + // busy-wait to widen the measured interval |
29 | 20 | } |
| 21 | + |
| 22 | + var dateTimeEnd = Date.now(); |
| 23 | + var timeEnd = __time(); |
| 24 | + |
| 25 | + dateDelta = dateTimeEnd - dateTimeStart; |
| 26 | + timeDelta = timeEnd - timeStart; |
| 27 | + tolerance = Math.max(10, dateDelta * 0.5); |
| 28 | + ok = timeDelta > 0 && Math.abs(dateDelta - timeDelta) < tolerance; |
30 | 29 | } |
| 30 | + |
| 31 | + expect(ok).toBe(true, "__time delta " + timeDelta + "ms diverged from Date.now delta " + dateDelta + "ms (tolerance " + tolerance + "ms) on all " + attempts + " attempts"); |
31 | 32 | }); |
32 | 33 | }); |
0 commit comments