Per quanto riguarda la filosofia di progettazione, libev è stato creato per migliorare alcune delle decisioni architetturali in libevent, ad esempio, l'utilizzo di variabili globali ha reso difficile usare libevent in modo sicuro in ambienti multithread, le strutture watcher sono grandi perché combinano I / O, tempo e segnale gestori in uno, i componenti extra come i server http e dns hanno sofferto di cattiva qualità di implementazione e conseguenti problemi di sicurezza, ei timer erano inesatti e non hanno affrontato bene i salti temporali.
Libev ha cercato di migliorare ciascuno di questi, non utilizzando variabili globali ma utilizzando un contesto di loop per tutte le funzioni, utilizzando piccoli watcher per ogni tipo di evento (un watcher I / O utilizza 56 byte su x86_64 rispetto a 136 per libevent), consentendo extra tipi di eventi come timer basati su wallclock rispetto a tempo monotono, interruzioni tra thread, preparare e controllare watcher per incorporare altri loop di eventi o per essere incorporati e così via.
Il problema dei componenti aggiuntivi è "risolto" non possedendoli affatto, quindi libev può essere piccolo ed efficiente, ma devi anche cercare altrove una libreria http, perché libev semplicemente non ne ha una (ad esempio, c'è una libreria molto correlata chiamata libeio che esegue I / O asincrono, che può essere utilizzata indipendentemente o insieme a libev, in modo da poter combinare e abbinare).
Quindi, in breve, libev cerca di fare solo una cosa (libreria di eventi POSIX), e questo nel modo più efficiente possibile. Libevent cerca di darti la soluzione completa (libreria degli eventi, libreria I / O non bloccante, server http, client DNS).
O, ancora più breve, libev cerca di seguire la filosofia del toolbox UNIX di fare solo una cosa, il più bene possibile.
Nota che questa è la filosofia di progettazione, che posso affermare con autorità perché ho progettato libev. Sta a te giudicare se questi obiettivi di progettazione sono stati effettivamente raggiunti o se la filosofia si basa su solidi principi.
Aggiornamento 2017:
Mi è stato chiesto più volte a quale inesattezza del timer mi riferisco e perché libev non supporta IOCP su Windows.
Per quanto riguarda i timer, libevent pianifica i timer relativi a un tempo di base sconosciuto che è nel futuro, senza che tu lo sappia. Libev può dirti in anticipo quale tempo di base utilizzerà per programmare i timer, il che consente ai programmi di utilizzare sia l'approccio libevent che l'approccio libev. Inoltre, libevent a volte fa scadere i timer in anticipo, a seconda del backend. Il primo è un problema API, il secondo è risolvibile (e potrebbe essere stato risolto da allora - non ho controllato).
Per quanto riguarda il supporto IOCP, non penso che possa essere fatto, poiché gli IOCP semplicemente non sono abbastanza potenti. Per prima cosa, hanno bisogno di un tipo di socket speciale, che limiterebbe ancora di più il set di handle consentito su Windows (ad esempio, i sopcket usati da perl sono del tipo "sbagliato" per IOCP). Inoltre, gli IOCP semplicemente non supportano affatto gli eventi di predisposizione I / O, possono solo eseguire l'I / O effettivo. Ci sono soluzioni alternative per alcuni tipi di handle, come eseguire una lettura fittizia di 0 byte, ma ancora una volta, questo limiterebbe ancora di più i tipi di handle che puoi usare su Windows e inoltre si baserebbe su un comportamento non documentato che probabilmente non è condiviso da tutti i provider di socket .
Per quanto ne so, nessun'altra libreria di eventi supporta IOCP su Windows. Ciò che fa libevent è che, oltre alla libreria degli eventi, ti consente di mettere in coda le operazioni di lettura / scrittura che possono essere eseguite tramite IOCP. Poiché libev non esegue l'I / O per te, non c'è modo di usare gli IOCP in libev stesso.
Questo è effettivamente di progettazione: libev cerca di essere piccolo e simile a POSIX, e Windows semplicemente non ha un modo efficiente per ottenere eventi I / O in stile POSIX. Se gli IOCP sono importanti, devi usarli tu stesso, o addirittura usare alcuni dei molti altri framework che fanno I / O per te e quindi puoi usare IOCP.