[erlang-questions] I'm having a SNAFU moment: timer:sleep/1

Dmitry Kolesnikov dmkolesnikov@REDACTED
Mon Jan 12 12:19:02 CET 2015


Hello,

timer:sleep() is implemented as receive after T -> ok end. It does not give you microsecond precision so that error is aggregated. 

secondly, lists:foreach(SleepFun, lists:seq(1, Num)) does not look performance friendly for big Num  

try tail recursion it gives better results.

sleep_loop(0, _) ->
        ok;
sleep_loop(N, IntervalMs) ->
        receive after IntervalMs -> ok end,
        sleep_loop(N - 1, IntervalMs).


- Dmitry

> On 12 Jan 2015, at 12:40, Roberto Ostinelli <roberto@REDACTED> wrote:
> 
> Dear list,
> I've probably missed out something since I'm not understanding what is going here.
> 
> I'm basically just trying to send messages periodically, though I found out that I wasn't seeing the behavior that I was expecting. It looks like the timer has some erratic behavior.
> 
> I've stripped out the code to the bare minimum and it looks like this:
> 
> -module(test).
> -export([sleep_periodical/2]).
> -export([sleep_loop/2]).
> 
> sleep_periodical(Num, IntervalMs) ->
> 	{Time, _Value} = timer:tc(?MODULE, sleep_loop, [Num, IntervalMs]),
> 	io:format("Finished in ~p microseconds.~n", [Time]).
> 
> sleep_loop(Num, IntervalMs) ->
> 	SleepFun = fun(_) -> timer:sleep(IntervalMs) end,
> 	lists:foreach(SleepFun, lists:seq(1, Num)).
> 
> 
> When I run this code, I see the following:
> 
> Erlang/OTP 17 [erts-6.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
> 
> Eshell V6.3  (abort with ^G)
> 1> c(test).
> {ok,test}
> 2> test:sleep_periodical(1000, 10).
> Finished in 12257397 microseconds.
> ok
> 3> test:sleep_periodical(2000, 10).
> Finished in 24518070 microseconds.
> ok
> 4> test:sleep_periodical(10000, 1).  
> Finished in 20000280 microseconds.
> ok
> 5> test:sleep_periodical(20000, 1).
> Finished in 40000685 microseconds.
> ok
> 
> So:
> Looping 1,000 times and sleeping 10 ms each time takes 12.26 seconds (instead of 10).
> Looping 2,000 times and sleeping 10 ms each time takes 24.52 seconds (instead of 20).
> Looping 10,000 times and sleeping 1 ms each time takes 20.00 seconds (instead of 10).
> Looping 20,000 times and sleeping 1 ms each time takes 40.00 seconds (instead of 20).
> Up to 10,000 times it takes 12,16% (1/8) more time, from 10,000 times it takes 100% (double).
> 
> Can some kind soul explain what I'm doing wrong here and how to achieve the desired results?
> 
> I'm on OSX, Erlang 17.4.
> 
> Help! ^^_
> r.
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150112/c18dc276/attachment.htm>


More information about the erlang-questions mailing list