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.