Dlaczego funkcja fwrite libc jest szybsza niż funkcja zapisu syscall?

Po dostarczeniu tego samego programu, który odczytuje losowo wygenerowany plik wejściowy i wyświetla ten sam ciąg, który odczytał na wyjściu. Jedyną różnicą jest to, że z jednej strony udostępniam metody odczytu i zapisu z linuxowych wywołań systemowych, az drugiej strony używam fread / fwrite.

Zmierzając moją aplikację z wejściem o rozmiarze 10Mb i powtarzając ją do / dev / null, i upewniając się, że plik nie jest buforowany, odkryłem, że fwrite libc jest szybsze o DUŻĄ skalę przy użyciu bardzo małych buforów (1 bajt w walizka).

Oto moje wyniki z czasu, używając fwrite:

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

I za pomocą wywołania systemowego napisz:

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

Jedyną możliwością, jaką mogę sobie wyobrazić, jest to, że wewnętrznie libc już buforuje moje dane wejściowe ... Niestety nie udało mi się znaleźć tak wielu informacji w sieci, więc może guru tutaj mogą mi pomóc.

questionAnswers(3)

yourAnswerToTheQuestion