Точные часы в Эрланге - PullRequest
       5

Точные часы в Эрланге

7 голосов
/ 27 декабря 2010

Я думал о том, как реализовать процесс, который дает количество дискретных интервалов времени, которые произошли с момента его запуска.Я теряю точность здесь?Как мне реализовать это без потери точности через некоторое время и после серьезного злоупотребления клиентом.Я как бы озадачен тем, как это сделать в 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 Ответ

10 голосов
/ 27 декабря 2010

Ручной подсчет тиков, как вы делаете, не будет точным из-за небольших колебаний расписания, а также из-за накладных расходов при выполнении функции.

Что вы хотите сделать, это получить отметку времени когда процесс запускается и передает это каждому рекурсивному вызову функции.Затем, когда вы хотите получить число тиков (в микросекундах), которое прошло с момента запуска процесса, возьмите новую метку времени и передайте их обеим значениям в now_diff .

Вы используете свою собственную концепцию «тиков», поэтому вы можете просто определить, сколько микросекунд составляет ваш «тик», и поделить на нее свой конечный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...