Управляемые событиями приложения не по своей природе быстрее.
С Почему события плохая идея (для серверов с высоким уровнем параллелизма) :
We examine the claimed strengths of events over threads and show that the
weaknesses of threads are artifacts of specific threading implementations
and not inherent to the threading paradigm. As evidence, we present a
user-level thread package that scales to 100,000 threads and achieves
excellent performance in a web server.
Это было в 2003 году. Конечно, с тех пор состояние многопоточности в современных ОС улучшилось.
Написание ядра сервера, основанного на событиях, означает повторное изобретение совместной многозадачности (стиль Windows 3.1) в вашем коде, скорее всего, в ОС, которая уже поддерживает правильную упреждающую многозадачность и без преимущества прозрачного переключения контекста. Это означает, что вы должны управлять состоянием в куче, которое обычно подразумевается указателем инструкции или хранится в переменной стека. (Если они есть на вашем языке, замыкания значительно облегчают эту боль. Попытка сделать это в Си гораздо менее увлекательна.)
Это также означает, что вы получаете все возможные совместные многозадачности. Если по какой-либо причине одному из ваших обработчиков событий требуется некоторое время, он останавливает поток событий. Абсолютно несвязанные запросы запаздывают. Чтобы избежать этого, даже длительные операции с ЦП должны быть отправлены куда-то еще. Когда вы говорите о ядре сервера с высокой степенью параллелизма, «длительная операция» - это относительный термин, порядка микросекунд для сервера, который должен обрабатывать 100 000 запросов в секунду. Я надеюсь, что системе виртуальной памяти никогда не придется извлекать страницы с диска за вас!
Получить хорошую производительность от архитектуры, основанной на событиях, может быть непросто, особенно если учесть задержку, а не только пропускную способность. (Конечно, есть много ошибок, которые вы можете сделать с потоками. Параллельность все еще трудна.)
Пара важных вопросов для автора нового серверного приложения:
- Как потоки работают на платформах, которые вы намереваетесь поддерживать сегодня? Они станут твоим узким местом?
- Если вы все еще застряли с плохой реализацией потока: почему никто не исправляет это?