You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@apr.apache.org by Jim Jagielski <ji...@jaguNET.com> on 2011/01/27 20:05:47 UTC

apr_queue_pop/push (Was: Re: Performance fix in event mpm)

Looping in APR as well...

On Jan 27, 2011, at 1:43 PM, Jim Jagielski wrote:

> 
> On Jan 27, 2011, at 1:31 PM, Jim Jagielski wrote:
> 
>> 
>> On Jan 27, 2011, at 12:21 PM, Jim Van Fleet wrote:
>> 
>>> I noticed that ap_queue_pop removes elements from the queue LIFO rather than FIFO.  Also noticed that apr_queue_pop uses a different technique which is not too expensive and is fifo, so I changed ap_queue/pop/push to use that technique and the receive problems went away.
>> Hmmm.... Not sure why the fdqueue would be LIFO. But certainly
>> the above ain't right for pop! :)
> 
> OK, looking over the history, it looks like the Q was changed from
> FIFO to LIFO ~10years ago (worker)... The reasoning:
> 
>  This is a rather simple patch that may improve cache-hit performance
>  under some conditions by changing the queue of available worker threads
>  from FIFO to LIFO. It also adds a tiny reduction in the arithmetic that
>  happens in the critical section, which will definately help if you have
>  a lame compiler.
> 
> Seems to me that changing back to FIFO would make sense, esp
> with trunk. We can profile the expense of the '% queue->bounds'
> but it seems to me that if it was really bad, we'd have seen it
> in apr and changed it there... after all, all we're doing
> with that is keeping it in bounds and a comparison and subtraction
> would do that just as well...

Doing some profiling, we can improve things more in apr_queue_pop/push...

    a++;
    if (a>=bounds)
      a -= bounds;

is about 2-4 times as fast as:

    a = (a+1)%bounds;

Seems like an EZ and obvious optimization to me ;)