Що стосується філософії дизайну, libev був створений для вдосконалення деяких архітектурних рішень у libevent, наприклад, глобальне використання змінних ускладнило безпечне використання libevent у багатопоточних середовищах, спостережливі структури великі, оскільки вони поєднують введення / вивід, час та сигнал обробників в одному, додаткові компоненти, такі як сервери http і dns, страждали від поганої якості реалізації та наслідків проблем із безпекою, а таймери були неточними і погано справлялися зі стрибками часу.
Libev намагався вдосконалити кожну з них, не використовуючи глобальних змінних, але використовуючи контур циклу для всіх функцій, використовуючи невеликі спостерігачі для кожного типу події (спостерігач вводу-виводу використовує 56 байт на x86_64 порівняно з 136 для libevent), що дозволяє додатково типи подій, такі як таймери, засновані на настінному годиннику та монотонному часі, переривання між потоками, підготовка та перевірка спостерігачів до вбудовування інших циклів подій або для вбудовування тощо.
Проблему додаткових компонентів "вирішують", не маючи їх взагалі, тому libev може бути невеликим та ефективним, але вам також потрібно шукати в іншому місці бібліотеку http, оскільки libev просто не має такої (наприклад, є дуже пов’язана бібліотека під назвою libeio, яка робить асинхронний введення / виведення, яку можна використовувати самостійно або разом з libev, так що ви можете змішувати та поєднувати)
Отже, коротко кажучи, libev намагається зробити лише одне (бібліотека подій POSIX), і це максимально ефективно. Libevent намагається надати вам повне рішення (lib подій, неблокуюча бібліотека вводу-виводу, сервер http, DNS-клієнт).
Або, ще коротше, libev намагається слідувати філософії набору інструментів UNIX, що робить лише одне, наскільки це можливо.
Зауважте, що це філософія дизайну, про яку я можу констатувати авторитет, тому що я створив libev. Чи справді ці цілі проекту були досягнуті, чи філософія ґрунтується на надійних принципах, вирішувати вам.
Оновлення 2017 року:
Мене неодноразово запитували, на яку неточність таймера я посилаюся, і чому libev не підтримує IOCP на вікнах.
Що стосується таймерів, то вільний графік планує таймери відносно деякого невідомого базового часу, який є в майбутньому, без того, щоб ви цього знали. Лібєв може заздалегідь повідомити вам, який базовий час він буде використовувати для планування таймерів, що дозволяє програмам використовувати як вільний підхід, так і підхід libev. Більше того, лівент іноді закінчує термін дії достроково, залежно від бекенда. Перше - це проблема API, останнє можна виправити (і, можливо, це було виправлено з - я не перевіряв).
Що стосується підтримки IOCP - я не думаю, що це можна зробити, оскільки IOCP просто недостатньо потужні. По-перше, їм потрібен спеціальний тип розеток, який би ще більше обмежив набір ручок, дозволених у Windows (наприклад, сокети, які використовуються perl, мають "неправильний" тип для IOCP. Крім того, IOCP просто взагалі не підтримують події готовності до введення-виведення, вони можуть виконувати лише фактичні введення-виведення. Існують способи вирішення деяких типів ручок, наприклад, манекен зчитування 0-байт, але, знову ж таки, це ще більше обмежить типи ручок, які ви можете використовувати у Windows, і, крім того, покладатиметься на незадокументовану поведінку, яку, ймовірно, не поділяють усі постачальники сокетів .
Наскільки мені відомо, жодна інша бібліотека подій також не підтримує IOCP на Windows. Що робить libevent, це, крім бібліотеки подій, це дозволяє вам чергувати операції читання / запису, які потім можна робити через IOCP. Оскільки libev не робить для вас введення-виведення, немає можливості використовувати IOCP у самому libev.
Це справді дизайн - libev намагається бути невеликим та схожим на POSIX, а у Windows просто немає ефективного способу отримання подій вводу / виводу у стилі POSIX. Якщо IOCP важливі, вам або доведеться використовувати їх самостійно, або дійсно використовувати деякі з багатьох інших фреймворків, які роблять для вас введення / виведення, і тому ви можете використовувати IOCP.