O código é executado na mesma velocidade, seja no kernel ou na extensão do usuário, mas há coisas que o código do kernel pode fazer diretamente, enquanto o código de usuário do usuário precisa saltar através de aros. Em particular, o código do kernel pode mapear a memória do aplicativo diretamente, para que possa copiar diretamente o conteúdo do arquivo entre a memória do aplicativo e os buffers internos de ou para os quais o hardware copia. O código do usuário tem que fazer uma cópia extra através de um pipe ou soquete, ou fazer uma operação de compartilhamento de memória mais complexa.
Além disso, cada operação de arquivo tem que passar pelo kernel - a única maneira de um processo interagir com qualquer coisa é através de uma chamada de sistema. Se a operação do arquivo for executada inteiramente dentro do kernel, haverá apenas uma transição de usuário / kernel e uma transição de kernel / usuário para executar, o que é bastante rápido. Se a operação do arquivo for executada por outro processo, deve haver uma alternância de contexto entre processos, o que requer uma operação muito mais cara na MMU .
O desempenho de velocidade ainda é insignificante em relação à maioria dos tempos de acesso ao hardware, mas pode ser observado quando o hardware não é o gargalo, especialmente porque muitas operações de hardware podem ser executadas de forma assíncrona enquanto o processador principal faz outra coisa; e cópias de dados entre processos mantêm a CPU ocupada.