Si sta utilizzando un buffer più grande?

5

Uso il buffer da parecchio tempo quando devo copiare un flusso o leggere un file.

E ogni volta che ho impostato la dimensione del buffer su 2048 o 1024, ma dal mio punto di vista un buffer è come un "secchio" che trasporta la mia "sabbia" (flusso) da una parte della mia terra (memoria) a un altra parte.

Quindi, aumentare la capacità del mio secchio in teoria mi permetterà di fare meno viaggi? È una buona cosa da fare nella programmazione?

    
posta Cyrbil 06.09.2012 - 18:31
fonte

4 risposte

4

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.

    
risposta data 06.09.2012 - 20:14
fonte
9

C'è una dimensione ottimale per un buffer. Un buffer troppo piccolo può attivare più chiamate di sistema del necessario, mentre un buffer troppo grande può attivare ricariche non necessarie della cache della CPU. Il modo migliore per rispondere a questa domanda per la tua situazione specifica è utilizzare un profiler.

    
risposta data 06.09.2012 - 19:12
fonte
7

La risposta è: dipende. Sfortunatamente, non c'è una sola risposta alla tua domanda. Il numero di variabili (che includono la velocità dell'hardware, la fonte del flusso, il tipo di disco da cui viene letto il file, la memoria disponibile, l'algoritmo di caching del file del sistema operativo, ecc.) Influiscono sulla risposta.

Per situazioni particolari, consiglio la misurazione delle prestazioni per vedere se un buffer bugger aiuta.

    
risposta data 06.09.2012 - 18:56
fonte
1

Dipende tutto da cosa stai facendo e con quali macchinari e così via. Prova diversi numeri e guarda cosa succede.

Tuttavia, ho scoperto che più grande è il buffer, più veloce è la lettura e la scrittura. Dico questo perché parli di 1024 e 2048. Prova invece alcuni buffer molto grandi. Ho trovato in un caso che stavo leggendo 8 volte più veloce passando da 8Kb a 100Kb, e ho ottenuto miglioramenti notevoli fino a 1Mb.

Non sono esperto di hardware, ma ho scoperto che in genere i computer eseguono copie sequenziali di byte a più velocità di una singola copia di byte. Forse fanno le cose in parallelo, forse sposta i dati attraverso le cache più velocemente, forse è magico. Tuttavia, l'utilizzo di grandi buffer e copie di array (o cicli che gli ottimizzatori possono trasformare in copie di array) può salvare un lotto di tempo.

    
risposta data 06.09.2012 - 20:48
fonte

Leggi altre domande sui tag