Syscall накладные расходы
Насколько велики (приблизительно) издержки системного вызова ввода-вывода в Linux из C
программа, я имею в виду, как плохо работает, например, много маленьких read / write
операции по сравнению с read / write
на больших буферах (на обычных файлах или сетевых сокетах)? Приложение сильно многопоточное.
2 ответа
Системные вызовы занимают по крайней мере 1-2 микросекунды на большинстве современных машин только для издержек системного вызова и гораздо больше времени, если они делают что-то сложное, что может блокировать или спать. Ожидайте не менее 20 микросекунд и порядка порядка миллисекунд для ввода-вывода. Сравните это с крошечным вызовом функции или макросом, который считывает байт из буфера пространства пользователя, который, вероятно, завершится за считанные наносекунды (может быть, 200 нс в плохой день).
Вы можете измерить это самостоятельно. Просто открой /dev/zero
и немного читать и писать, измеряя время. Также варьируйте количество байтов, которые вы вводите в каждый вызов - например, 1 байт, 2 байта, 128 байт, .. 4096 байт. Также позаботьтесь об использовании read(2)
а также write(2)
системные вызовы и ничего, используя внутренние буферы.