2010-12-27 21 views
7

Estaba pensando en cómo implementar un proceso que proporcione el número de intervalos discretos en el tiempo que se han producido desde que comenzó. ¿Estoy perdiendo precisión aquí? ¿Cómo implemento esto sin pérdida de precisión después de un tiempo y después de un gran abuso de clientes? Estoy algo perplejo sobre cómo hacer esto en Erlang.Reloj preciso en Erlang

Naturalmente, no quiero utilizar una llamada al sistema como 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. 

Respuesta

10

Manual de garrapatas contando que estás haciendo no va a ser exacta debido a las ligeras fluctuaciones de programación, así como sobrecarga de ejecución de la función.

Lo que quiere hacer es tomar un timestamp cuando comience el proceso y pasarlo a cada llamada recursiva a la función. Luego, cuando desee obtener el número de tics (en microsegundos) que han transcurrido desde que comenzó el proceso, tome una nueva marca de tiempo y páselos a ambos al now_diff.

Parece que está utilizando su propio concepto de "tics", por lo que puede averiguar cuántos microsegundos su "tic" es y dividir el resultado final por ello.

+0

Sí, supongo que es la manera más fácil .. Todavía puedo usar el concepto de "tick resolution" con el tiempo de espera "after ..", para reducir el número de llamadas recursivas que se realizan. – buddhabrot