Erlang中准确的时钟

时间:2010-12-27 14:51:24

标签: erlang

我在考虑如何实现一个过程,该过程给出了自启动以来发生的离散时间间隔的数量。 我在这里失去了准确性吗?一段时间后以及在滥用客户端之后,我如何实现这一目标而不会失去准确性。我对在Erlang中如何做到这一点感到很难过。

当然我不想使用系统调用,例如now()。

-module(clock).
-compile([export_all]).

start(Time) ->
    register(clock, spawn(fun() -> tick(Time, 0) end)).

stop() -> clock ! stop.

tick(Time, Count) ->
    receive
        nticks ->
            io:format("~p ticks have passed since start~n", [Count])
    after 0 -> true
    end,
    receive
        stop ->
            void
    after Time ->
            tick(Time, Count + 1)
    end.

1 个答案:

答案 0 :(得分:10)

由于轻微的调度波动以及功能执行开销,您正在进行的手动计时计数并不准确。

您要做的是在进程启动时抓取timestamp并将其传递给对该函数的每次递归调用。然后,当您想要获取自开始该过程以来已经过去的滴答数(以微秒为单位)时,获取一个新的时间戳并将它们都传递到now_diff

看起来你正在使用自己的“滴答”概念,所以你可以弄清楚你的“滴答”是多少微秒,并用它来划分你的最终结果。