Używam wywołania funkcji fwrite()
do zapisu danych do potoku w systemie Linux.Zrozumienie zachowania buforowania fwrite()
Wcześniej fwrite()
był nazywany małych ilości danych (średnio 20 bajtów) wielokrotnie buforujący pozostawiono do fwrite()
. strace w procesie pokazało, że zapisywano 4096 bajtów danych jednocześnie.
Okazało się, że ten proces pisania był wąskim gardłem w moim programie. Zdecydowałem się więc na buforowanie danych w moim kodzie do bloków 64KB, a następnie napisanie całego bloku na raz za pomocą fwrite()
. Użyłem setvbuf()
, aby ustawić wskaźnik FILE * na "Bez buforowania".
Poprawa wydajności nie była tak znacząca, jak się spodziewałem.
Co ważniejsze, wyjście strace
pokazało, że dane wciąż były zapisywane 4096 bajtów na raz. Czy ktoś może mi wyjaśnić to zachowanie? Jeśli wywołuję fwrite()
z 64 KB danych, dlaczego zapisuje się tylko 4096 bajtów na raz?
Czy istnieje alternatywa dla fwrite()
zapisywania danych w rurze za pomocą wskaźnika FILE *?
Czy możesz pokazać nam kod? – tuxuday
@Shailesh_Tainwala: Być może piszesz kod w języku C++, ale jest to raczej pytanie c niż C++. 'fwrite()' jest funkcją c, a nie C++. Dodałem tag c do Twojego pytania, dzięki czemu możesz zdobyć szerszą publiczność. –