So, it would seem that the jitter I’ve been experiencing in Windows is a result of the limitations of Erlang + Windows
My own tests corroborate this:
0> lists:foreach(fun(X) ->
First = erlang:system_time(nanosecond)/1000000000,
timer:sleep(X),
Second = erlang:system_time(nanosecond)/1000000000,
TimeDiff = Second - First,
io:format("~p called\n~p slept\n\n", [X, trunc(TimeDiff * 1000)])
end, lists:seq(1,50)).
1 called
16 slept
2 called
16 slept
3 called
14 slept
4 called
16 slept
5 called
16 slept
6 called
15 slept
7 called
16 slept
8 called
15 slept
9 called
15 slept
10 called
16 slept
11 called
15 slept
12 called
16 slept
13 called
16 slept
14 called
14 slept
15 called
16 slept
16 called
30 slept
17 called
31 slept
30 called
32 slept
31 called
31 slept
32 called
46 slept
33 called
47 slept
34 called
45 slept
35 called
47 slept
36 called
46 slept
37 called
46 slept
38 called
46 slept
39 called
47 slept
40 called
46 slept
41 called
47 slept
42 called
45 slept
43 called
47 slept
44 called
46 slept
45 called
47 slept
46 called
47 slept
47 called
46 slept
48 called
61 slept
49 called
63 slept
50 called
61 slept
Bummer.