Шрифт:
Сравнение времени выполнения различных версий функции str_cli
Итак, мы продемонстрировали четыре различных версии функции
354,0 с, режим остановки и ожидания (см. листинг 5.4);
12,3 с, функция
6,9 с, неблокируемый ввод-вывод (см. листинг 16.1);
8,7 с, функция
8,5 с, версия с потоками (см. листинг 26.1).
Наша версия с неблокируемым вводом-выводом почти вдвое быстрее версии, использующей блокируемый ввод-вывод с функцией
16.3. Неблокируемая функция connect
Когда сокет TCP устанавливается как неблокируемый, а затем вызывается функция
1. Трехэтапное рукопожатие может наложиться на какой-либо другой процесс. Для выполнения функции
2. Мы можем установить множество соединений одновременно, используя эту технологию. Этот способ уже стал популярен в применении к веб-браузерам, и такой пример мы приводим в разделе 16.5.
3. Поскольку мы ждем завершения установления соединения с помощью функции
Как бы просто ни выглядела неблокируемая функция
Даже если сокет является неблокируемым, то когда сервер, с которым мы соединяемся, находится на том же узле, обычно установление соединения происходит немедленно при вызове функции
В Беркли-реализациях (а также POSIX) имеются два следующих правила, относящихся к функции
Эти два правила в отношении функции select выпадают из общего ряда наших правил из раздела 6.3 относительно условий, при которых дескриптор становится готовым для чтения или записи. В сокет TCP можно записывать, если достаточно места в буфере отправки (что всегда будет выполнено в случае присоединенного сокета, поскольку мы еще ничего не записали в сокет) и сокет является присоединенным (что выполняется, только когда завершено трехэтапное рукопожатие). При наличии ошибки, ожидающей обработки, появляется возможность читать из сокета и записывать в сокет.
С неблокируемыми функциями
16.4. Неблокируемая функция connect: клиент времени и даты
В листинге 16.7 показана наша функция
Первые три аргумента являются обычными аргументами функции