<div dir="ltr"><div class="gmail_quote">Deep in the bowels of the C code for the Erlang emulator lurks this routine (otp_src_R12B-3/erts/emulator/sys/unix/sys.c):<br><div dir="ltr"><br><span style="font-family: courier new,monospace;">SysHrTime sys_gethrtime(void)</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    struct timespec ts;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    long long result;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    if (<b>clock_gettime(CLOCK_</b><b>MONOTONIC,&ts)</b> != 0) {</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    erl_exit(1,"Fatal, could not get clock_monotonic value!, "</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">         "errno = %d\n", errno);</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    }</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    result = ((long long) ts.tv_sec) * 1000000000LL + </span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">    ((long long) ts.tv_nsec);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    return (SysHrTime) result;</span><br style="font-family: courier new,monospace;">

<span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;"><br>This is used on some Unix and Unix-like systems (for example, my Ubuntu Linux system) to get the high-resolution hardware timer, which sets the microseconds part of the value returned by now().<br>

<br>There's a very telling note in the Linux man page for clock_gettime():<br><br>      The processors in an SMP system do not start all at exactly the same time and therefore the timer registers are typically  running  at  an  offset.   Some<br>

       architectures include code that attempts to limit these offsets on bootup.  However, the code cannot guarantee to accurately tune the offsets.  Glibc con‐<br>       tains no provisions to deal with these offsets (unlike the Linux Kernel).  Typically these offsets are small and therefore the effects may  be  negligible<br>

       in most cases.<br><br>I can't guarantee it, but I imagine this is part of the discrepancy, and that any operating system would have the same challenges because of SMP. In any case, it would be quite a challenge to get two Erlang processes running in different Erlang emulators to be so precisely synchronized that they execute the now() call within 1000 microseconds of each other, even if you could guarantee that each emulator was running on its own CPU.<br>
<br>Hope this helps.<br><br></div></div>
</div>