Quanto à filosofia de design, libev foi criado para melhorar algumas das decisões arquitetônicas em libevent, por exemplo, o uso de variáveis globais dificultou o uso de libevent com segurança em ambientes multithread. As estruturas do observador são grandes porque combinam I / O, tempo e sinal manipuladores em um, os componentes extras, como os servidores http e dns, sofriam de má qualidade de implementação e problemas de segurança resultantes, e os temporizadores eram inexatos e não lidavam bem com os saltos de tempo.
Libev tentou melhorar cada um deles, não usando variáveis globais, mas usando um contexto de loop para todas as funções, usando pequenos observadores para cada tipo de evento (um observador de I / O usa 56 bytes em x86_64 em comparação com 136 para libevent), permitindo tipos de eventos, como temporizadores baseados em relógio de parede vs. tempo monotônico, interrupções entre threads, preparar e verificar observadores para incorporar outros loops de evento ou para serem incorporados e assim por diante.
O problema do componente extra é "resolvido" por não tê-los, então libev pode ser pequeno e eficiente, mas você também precisa procurar em outro lugar por uma biblioteca http, porque libev simplesmente não tem uma (por exemplo, há um biblioteca muito relacionada chamada libeio que faz I / O assíncrona, que pode ser usada independentemente ou junto com a libev, para que você possa misturar e combinar).
Resumindo, libev tenta fazer apenas uma coisa (biblioteca de eventos POSIX), e isso da maneira mais eficiente possível. Libevent tenta fornecer a solução completa (event lib, biblioteca de E / S sem bloqueio, servidor http, cliente DNS).
Ou, ainda mais resumido, libev tenta seguir a filosofia da caixa de ferramentas do UNIX de fazer apenas uma coisa, o melhor possível.
Observe que essa é a filosofia de design, que posso afirmar com autoridade porque projetei o libev. Se essas metas de design foram realmente alcançadas ou se a filosofia é baseada em princípios sólidos, depende de você julgar.
Atualização de 2017:
Fui questionado várias vezes sobre a inexatidão do timer a que me refiro e por que o libev não oferece suporte a IOCPs no Windows.
Quanto aos cronômetros, o libevent agenda cronômetros relativos a algum tempo base desconhecido que está no futuro, sem você saber. Libev pode lhe dizer com antecedência qual horário base ele usará para agendar temporizadores, o que permite que programas usem tanto a abordagem libevent quanto a abordagem libev. Além disso, o libevent às vezes expirava os temporizadores mais cedo, dependendo do backend. O primeiro é um problema de API, o último pode ser corrigido (e pode ter sido corrigido desde então - eu não verifiquei).
Quanto ao suporte IOCP - não acho que possa ser feito, pois os IOCPs simplesmente não são poderosos o suficiente. Por um lado, eles precisam de um tipo de socket especial, o que limitaria o conjunto de identificadores permitidos no Windows ainda mais (por exemplo, os sopckets usados por perl são do tipo "errado" para IOCPs). Além disso, os IOCPs simplesmente não suportam eventos de prontidão de E / S, eles só podem fazer E / S reais. Existem soluções alternativas para alguns tipos de identificador, como fazer uma leitura fictícia de 0 byte, mas, novamente, isso limitaria os tipos de identificador que você pode usar no Windows ainda mais e, além disso, dependeria de um comportamento não documentado que provavelmente não é compartilhado por todos os provedores de soquete .
Até onde sei, nenhuma outra biblioteca de eventos oferece suporte a IOCPs no Windows. O que libevent faz é, além da biblioteca de eventos, permitir que você enfileire operações de leitura / gravação que podem ser feitas via IOCPs. Como a libev não faz E / S para você, não há como usar IOCPs na própria libev.
Isso é de fato intencional - libev tenta ser pequeno e semelhante ao POSIX, e o Windows simplesmente não tem uma maneira eficiente de obter eventos de E / S no estilo POSIX. Se os IOCPs forem importantes, você mesmo terá que usá-los ou, de fato, usar alguns dos muitos outros frameworks que fazem E / S para você e, portanto, podem usar os IOCPs.