On 28/06/2012, at 12:13, Ben Noordhuis wrote:
> On Thu, Jun 28, 2012 at 10:40 AM, Jorge <jo...@jorgechamorro.com> wrote:
>> 
>> 
>> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc#L202
>> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc#L281
>> https://github.com/xk/node-threads-a-gogo/blob/master/src/threads_a_gogo.cc#L646
>> https://github.com/xk/node-sound/blob/master/src/sound.cc#L509
>> https://github.com/xk/node-sound/blob/master/src/sound.cc#L1014
>> 
>> But ev_async_pending is a macro that expands to this:
>> 
>> if (!(+(&watcher)->sent)) ev_async_send(ev_default_loop_uc_ (), &watcher);
>> 
>> which is not a function call, soooo.... it's not a good idea to make it "the 
>> default behaviour", because if you do that the check would be made inside 
>> uv_async_send() so the function call would happen always which is exactly 
>> what one's trying to avoid when using ev_async_pending.
> 
> I'm not that worried about the function call overhead. The reason that
> you're seeing a slowdown is that uv_async_send() is always making a
> syscall now.

Yes, libuv is handling my async events (370-230)/(370/100) = 38% slower than 
libev.

The difference -in my Mac- between making the watcher.sent test before the 
ev_async_send() call and making it after/inside the ev_async_send() call is of 
about a 30% in performance loss in that single line of code alone:

<https://gist.github.com/3011746>
$ gcc -O0 /Users/jorge/Desktop/functionCall.c
$ ./a.out
without a function call: 2.779617 ns per iteration
with a function call   : 3.572935 ns per iteration

With the function call it's 28.540551 percent slower than without the function 
call

In the grand total this may not matter much, but in low level code such as this 
every ns counts imo.
-- 
Jorge.

Reply via email to