Po dostarczeniu tego samego programu, który odczytuje losowo wygenerowany plik wejściowy i odtwarza ten sam ciąg, który odczytuje na wyjściu. Jedyna różnica polega na tym, że z jednej strony udostępniam metody odczytu i zapisu z linuksowych linków, az drugiej strony używam fread/fwrite.Dlaczego funkcja fwrite libc działa szybciej niż funkcja zapisu syscall?
Odmierzając czas na moją aplikację o wielkości wejściowej 10 MB i wyświetlając ją w/dev/null i upewniając się, że plik nie jest zapisany w pamięci podręcznej, odkryłem, że fwrite w libc jest szybsze w skali DUŻEJ przy użyciu bardzo małych buforów (1 bajt w przypadku).
Oto moje wyjście od czasu, przy użyciu fwrite:
real 0m0.948s
user 0m0.780s
sys 0m0.012s
I stosując zapis syscall:
real 0m8.607s
user 0m0.972s
sys 0m7.624s
Jedyna możliwość, że mogę myśleć o to, że wewnętrznie libc jest już buforowanie mój input ... Niestety nie mogłem znaleźć tak wielu informacji w Internecie, więc może ci guru mogliby mi pomóc.
"Wewnętrznie libc już buforuje moje wejście". Dokładnie to robi. Prawdopodobnie możesz przeczytać kod źródłowy libc, jeśli chcesz, i zobaczyć dokładnie, jak to robi. – kquinn