Por que a função fwrite libc é mais rápida que a função de gravação syscall?

Depois de fornecer o mesmo programa que lê um arquivo de entrada gerado aleatoriamente e ecoa a mesma cadeia de caracteres, ele lê uma saída. A única diferença é que, por um lado, estou fornecendo os métodos read e write do linux syscalls, e do outro lado estou usando o fread / fwrite.

Timing meu aplicativo com uma entrada de 10Mb em tamanho e ecoando para / dev / null, e certificando-se o arquivo não é armazenado em cache, descobri que fwrite da libc é mais rápido por uma escala grande ao usar buffers muito pequenos (1 byte em caso).

Aqui está a minha saída do tempo, usando fwrite:

real    0m0.948s
user    0m0.780s
sys     0m0.012s

E usando a gravação syscall:

real    0m8.607s
user    0m0.972s
sys     0m7.624s

A única possibilidade que posso pensar é que internamente a libc já está armazenando em buffer minha entrada ... Infelizmente eu não consegui encontrar tantas informações pela web, então talvez os gurus daqui possam me ajudar.

questionAnswers(3)

yourAnswerToTheQuestion