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

Sergej Jurečko sergej.jurecko@REDACTED
Mon Jan 12 12:12:47 CET 2015


timer:sleep is not even remotely as accurate for those low numbers. It can
not go lower than 20ms or so from what i remember.

I have had this issue once when I needed low interval for timer. I used an
external c app which printed to stdout every 5ms. I dont think there is any
way in erlang to get a timer that low.

Sergej
On Jan 12, 2015 11:46 AM, "Roberto Ostinelli" <roberto@REDACTED> wrote:

> Additionally:
>
> 6> test:sleep_periodical(1000, 1).
> Finished in 1999097 microsecond
>
> So:
>
>    - Looping 1,000 times and sleeping 1 ms each time takes 2.00 seconds
>    (instead of 1).
>
> Looks like it's ms related, not total count.
>
> Best,
> r.
>
>
>
> On Mon, Jan 12, 2015 at 11:40 AM, 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/eb675c42/attachment.htm>


More information about the erlang-questions mailing list