Sto utilizzando la funzione chiamata fwrite()
per scrivere dati su una pipe su Linux.Informazioni sul comportamento di buffering di fwrite()
In precedenza, fwrite()
veniva chiamato per piccoli blocchi di dati (in media 20 byte) ripetutamente e il buffering veniva lasciato a fwrite()
. Strace sul processo ha mostrato che 4096 byte di dati venivano scritti alla volta.
Si è scoperto che questo processo di scrittura era il collo di bottiglia del mio programma. Così ho deciso di memorizzare i dati nel mio codice in blocchi di 64 KB e quindi scrivere l'intero blocco alla volta utilizzando fwrite()
. Ho usato setvbuf()
per impostare il puntatore FILE * su "Nessun buffer".
Il miglioramento delle prestazioni non è stato così significativo come mi aspettavo.
Ancora più importante, l'output strace
ha mostrato che i dati venivano ancora scritti 4096 byte alla volta. Qualcuno può spiegarmi questo comportamento? Se sto chiamando fwrite()
con 64 KB di dati, perché scrive solo 4096 byte alla volta?
Esiste un'alternativa a fwrite()
per la scrittura di dati su una pipe utilizzando un puntatore FILE *?
Puoi mostrarci il codice? – tuxuday
@Shailesh_Tainwala: potresti scrivere il tuo codice in C++, ma questa è una domanda c piuttosto che C++. 'fwrite()' è una funzione c, non una funzione C++. Ho aggiunto un tag c alla tua domanda in modo da poter ottenere un pubblico più ampio. –