2012-07-24 9 views
6

¿Qué debería preferir:Erlang: start_timer/3 vs temporizador: send_after/3

erlang:start_timer(Ttl, self(), time_to_die) 

o

timer:send_after(Ttl, self(), {timeout, time_to_die}) 

si mi caso de uso es enviar un único mensaje a un átomo de gen_server? Espero tener cientos de miles de gen_servers y cada uno de ellos necesitará tener un evento temporizador TTL asociado.

Respuesta

20

El Common Caveats section of the Erlang Efficiency Guide dice:

Creación de temporizadores utilizando erlang:send_after/3 y erlang:start_timer/3 es mucho más eficiente que el uso de los contadores de tiempo proporcionados por el módulo timer. El módulo timer utiliza un proceso separado para administrar los temporizadores, y ese proceso puede sobrecargarse fácilmente si muchos procesos crean y cancelan temporizadores con frecuencia (especialmente cuando se utiliza el emulador SMP).

Las funciones en el módulo timer que no gestionar temporizadores (como timer:tc/3 o timer:sleep/1), no llame al proceso de temporizador-servidor y, por tanto, son inofensivos.

+1

Muchas gracias por el enlace a la guía de eficiencia –

-2

Dado que no sé a ciencia cierta cuál es su preferencia, asumiré que usted está pidiendo cuál es más rápido cuando tengo n procesos:

Sin conocer un 100%, no creo Hará una gran diferencia. Si tiene cientos o miles de instancias de gen_server, le sugiero que dedique su tiempo a optimizarlas. Si todavía necesita perseguir microsegundos en la entrega de mensajes, siempre puede probar ambos y analizar los perfiles para ver cuál es más rápido.

+0

Esto no responde a la pregunta de ninguna manera –