Facciamo finta di copiare una struttura dati da un file a un altro e utilizzi un buffer per archiviare i dati tra la lettura e la data di scrittura.
C'è un sovraccarico quando leggi e scrivi dati. Su disco, la testa deve trovare il settore e leggere o scrivere la traccia. In memoria, richiede un'istruzione del processore per spostare un blocco di memoria (in genere 1-8 byte alla volta) più un'operazione bus per spostare i dati da una parte della memoria a un'altra, o tra la memoria e il processore o la memoria e il disco. Ogni chunk che leggi viene elaborato in un loop da qualche parte e più piccoli sono i blocchi, più volte deve essere eseguito il ciclo.
Se il tuo buffer è un singolo byte, dovrai sostenere questo sovraccarico ogni volta che leggi o scrivi un byte di dati. Nel nostro esempio, il disco non può leggere e scrivere contemporaneamente, quindi la scrittura potrebbe dover attendere fino al termine della lettura. Per un file da un byte, questo è il meglio che puoi fare, ma per un file da 1 MB, questo sarà estremamente lento.
Se si dispone di un buffer da 10 MB e si desidera copiare un file da 10 MB, è possibile leggere l'intero contenuto nel buffer, quindi scriverlo di nuovo in un unico passaggio.
Ora, se vuoi copiare un file da 20 GB, probabilmente non hai molta memoria. Anche se lo fai, se ogni programma assegnasse 20 GB di memoria per i buffer, non sarebbe rimasto nulla! Quando assegni la memoria, devi rilasciarla, e sia l'allocazione che il rilascio possono richiedere del tempo.
Se un cliente di qualche tipo sta aspettando interi pezzi di dati, a volte pezzi più piccoli sono migliori. Se il cliente riceve alcuni blocchi e sa di non volere il resto, può abortire, o forse può mostrare quello che ha in attesa di altro in modo che un utente umano possa vedere che qualcosa sta succedendo.
Se si conosce la quantità di dati che si sta copiando prima di allocare il buffer, è possibile creare un buffer che sia la dimensione ideale per i dati che si stanno copiando. O la dimensione esatta di tutti i tuoi dati, o abbastanza grande per i dati da copiare in un numero ragionevole di blocchi. Se devi indovinare, alcune dimensioni intorno a 1 MB sono ragionevoli per uno scopo sconosciuto.
Per creare il buffer di dimensioni perfette, è necessario studiare i dati per i quali si intende utilizzarlo. Se stai copiando dei file, quanto è grande la maggior parte dei file copiati dalle persone? Quindi indovini in una buona dimensione del buffer e ora. Modifica le dimensioni e cronometra di nuovo. La tua memoria totale disponibile potrebbe limitare la tua dimensione massima. Alla fine si arriva alla dimensione del buffer ideale per il proprio obiettivo specifico.