]> git.llucax.com Git - software/libev.git/blobdiff - README
make timers best-effort non-drifting
[software/libev.git] / README
diff --git a/README b/README
index 544055158646a50ac88879ae303d575a18bd3bbe..de8bb0b119bc67a1910ee52e2a50eb55e1ea121d 100644 (file)
--- a/README
+++ b/README
@@ -1,62 +1,78 @@
-libev is modelled after libevent (http://monkey.org/~provos/libevent/), but aims
-to be faster and more correct, and also more featureful. Examples:
+libev is a high-performance event loop/event model with lots of features.
 
-- multiple watchers can wait for the same event without deregistering others.
+It is modelled (very losely) after libevent
+(http://monkey.org/~provos/libevent/) and the Event perl module, but aims
+to be faster and more correct, and also more featureful.
+
+DIFFERENCES AND COMPARISON TO LIBEVENT:
+
+(comparisons relative to libevent-1.3e and libev-0.00, see also the benchmark
+at http://libev.schmorp.de/bench.html).
+
+- multiple watchers can wait for the same event without deregistering others,
+  both for file descriptors as well as signals.
   (registering two read events on fd 10 and unregistering one will not
-  break the other)
+  break the other).
 
 - fork() is supported and can be handled
-  (there is no way to recover from a fork when libevent is active)
+  (there is no way to recover from a fork when libevent is active).
 
-- timers are handled as a priority queue
-  (libevent uses a less efficient red-black tree)
+- timers are handled as a priority queue (important operations are O(1))
+  (libevent uses a much less efficient but more complex red-black tree).
 
 - supports absolute (wallclock-based) timers in addition to relative ones,
   i.e. can schedule timers to occur after n seconds, or at a specific time.
 
-- timers can be repeating (both absolute and relative ones)
+- timers can be repeating (both absolute and relative ones).
 
 - detects time jumps and adjusts timers
-  (works for both forward and backward time jumps and also for absolute timers)
-
-- can correctly remove timers while executing callbacks
-  (libevent doesn't handle this reliably and can crash)
+  (works for both forward and backward time jumps and also for absolute timers).
 
 - race-free signal processing
-  (libevent may delay processing signals till after the next event)
+  (libevent may delay processing signals till after the next event).
 
 - less calls to epoll_ctl
   (stopping and starting an io watcher between two loop iterations will now
-  result in spuriois epoll_ctl calls)
+  result in spuriois epoll_ctl calls).
 
 - usually less calls to gettimeofday and clock_gettime
-  (libevent calls it on every timer event change, libev twice per iteration)
+  (libevent calls it on every timer event change, libev twice per iteration).
 
 - watchers use less memory
-  (libevent on amd64: 152 bytes, libev: <= 56 bytes)
+  (libevent on amd64: 152 bytes, libev: <= 56 bytes).
 
 - library uses less memory
   (libevent allocates large data structures wether used or not, libev
-  scales all its data structures dynamically)
+  scales all its data structures dynamically).
 
 - no hardcoded arbitrary limits
   (libevent contains an off-by-one bug and sometimes hardcodes a limit of
-  32000 fds)
+  32000 fds).
 
 - libev separates timer, signal and io watchers from each other
   (libevent combines them, but with libev you can combine them yourself
-  by reusing the same callback and still save memory)
+  by reusing the same callback and still save memory).
 
 - simpler design, backends are potentially much simpler
   (in libevent, backends have to deal with watchers, thus the problems)
-  (epoll backend in libevent: 366 lines, libev: 89 lines, and more features)
+  (epoll backend in libevent: 366 lines, libev: 90 lines, and more features).
 
-whats missing?
+- libev handles EBADF gracefully by removing the offending fds.
 
-- evdns, evhttp, bufferevent are missing, libev is only an even library at
-  the moment.
+- doesn't rely on nonportable BSD header files.
+
+- a event.h compatibility header exists, and can be used to run a wide
+  range of libevent programs unchanged (such as evdns.c).
+
+- win32 compatibility for the core parts.
+
+- the event core library (ev and event layer) compiles and works both as
+  C and C++.
+
+whats missing?
 
-- no priority support at the moment.
+- no event-like priority support at the moment (the ev priorities
+  are not yet finished and work differently, but you cna use idle watchers
+  to get a similar effect).
 
-- kqueue, poll (libev currently implements epoll and select).