On Feb 10, 2007, at 9:29 AM, Person wrote:
Hi,
Is it normally that high cost function call issue about event_queue_remove()? I profiles my program with gprof. I found the most spent time function call is event_queue_remove().
However, I only remove events when connection is closed (conn_drop()).
There are two types events with flag EV_WRITE and (EV_READ | EV_PERSIST) in my program. And, there are about 250 connections and 250*2 events (read and write fd).

Well, event_queue_remove() is getting called in three different ways. From least to most often,

* Twice from each conn_drop(), on the EVLIST_INSERTED queue.
* Once implicitly on each write callback on the EVLIST_INSERTED queue, since you're not using EV_PERSIST on writes
* Once on each callback on the EVLIST_ACTIVE queue.

It just removes the event from a doubly-linked list in O(1) time. So even with so many calls, I'm surprised to see that 8.65%. A few thoughts:

* If this trivial function is so high up on the CPU usage, is your program not CPU-bound at all?

* Does gprof add overhead to each function call? I don't remember how it works, but if it does, this might unfairly penalize quick but often-called functions like event_queue_remove(). Seems like event_queue_insert() should be in the same boat, though...it gets called as often and does a very similar thing.

* Maybe event_queue_remove() is getting a disproportionate number of cache misses and waiting for memory access? Does "valgrind -- tool=cachegrind" give this kind of information?

Cheers,
Scott

--
Scott Lamb <http://www.slamb.org/>
_______________________________________________
Libevent-users mailing list
Libevent-users@monkey.org
http://monkey.org/mailman/listinfo/libevent-users

Reply via email to