Realizzare buffer scrittura [c/c++]
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- targzeta
- Iper Master
- Messaggi: 6631
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: Realizzare buffer scrittura [c/c++]
Se puoi, dovresti fare prove aumentando il buffer per vedere se le cose migliorano ancora. Se ci si pensa un attimo è ovvio che la bufferizzazione porta miglioramenti, è stata inventata a posta .
Emanuele
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- Mercyful
- Linux 1.x
- Messaggi: 196
- Iscritto il: ven 25 lug 2008, 18:20
- Nome Cognome: Ilario Pittau
- Slackware: 13.0
- Kernel: 2.6.29.6-generic
- Desktop: xfce 4.6
- Località: Torino
Re: Realizzare buffer scrittura [c/c++]
Ciao FE,
belli i tuoi risultati con il buffer, ma se dici che il codice che hai scritto è lo stesso che stai testando ho qualche dubbio sulla sua correttezza.
Penso che il primo for sia leggermente da modificare perchè se usi tmp = tmp +t incrementi il puntatore sempre di un valore crescente quando lo dovresti incrementare di uno alla vota. Su questo vorrei la conferma di qualcuno.
Poi anche se la cosa che fai è abbastanza piccola e veloce ti consiglio di usare memcpy per la copia di memoria in quanto molto più ottimizzata e magari riesci a copiare più di un byte alla volta.
A questo proposito esistono tante versioni di questa funzione di basso livello, anche se quelle implementate da M$ penso che siano ottimizzate abbastanza e magari anche più sicure per quanto riguarda i 64bit, (sempre che tu stia facendo un programma 64bit-compatibile), ti propongo questo sito che parla di una versione che dice essere più prestazionale di quelle di Windows e POSIX sopratutto con memoria non allineata.
http://www.vik.cc/daniel/portfolio/memcpy.htm
Non so se è aggiornata come prestazioni, se la provi facci sapere!
Ciao ciao!
belli i tuoi risultati con il buffer, ma se dici che il codice che hai scritto è lo stesso che stai testando ho qualche dubbio sulla sua correttezza.
Penso che il primo for sia leggermente da modificare perchè se usi tmp = tmp +t incrementi il puntatore sempre di un valore crescente quando lo dovresti incrementare di uno alla vota. Su questo vorrei la conferma di qualcuno.
Poi anche se la cosa che fai è abbastanza piccola e veloce ti consiglio di usare memcpy per la copia di memoria in quanto molto più ottimizzata e magari riesci a copiare più di un byte alla volta.
A questo proposito esistono tante versioni di questa funzione di basso livello, anche se quelle implementate da M$ penso che siano ottimizzate abbastanza e magari anche più sicure per quanto riguarda i 64bit, (sempre che tu stia facendo un programma 64bit-compatibile), ti propongo questo sito che parla di una versione che dice essere più prestazionale di quelle di Windows e POSIX sopratutto con memoria non allineata.
http://www.vik.cc/daniel/portfolio/memcpy.htm
Non so se è aggiornata come prestazioni, se la provi facci sapere!
Ciao ciao!
- kreen
- Linux 2.x
- Messaggi: 228
- Iscritto il: mer 1 feb 2006, 18:32
- Slackware: 12.0
- Kernel: 2.6.21.5-smp
- Desktop: KDE
- Località: Verona
Re: Realizzare buffer scrittura [c/c++]
Ciao FireEater.
concordo con Mercyful sul fatto che aument tmp di valori sempre crescenti (tmp +0, tmp + 1, ..., tmp + s -1). Ma visto che ora usi il memcpy il problema non sussiste piu'.
Su fread e fwrite, non ci puoi fare nulla, IMHO, perche' tu chiedi al S.O. di leggere e scrivere, ma e' lui che gestisce l'HW a basso livello e quindi la bufferizzazione.
La cosa migliore che puoi fare in questo caso e' allinearti con la misura del buffer e leggere e scrivere blocchi di tale dimensione (ora non so nello specifico caso come si comporta il tuo programma).
L'unico consiglio che ti posso dare io e' di non pulire il buffer: a cosa serve? Sprechi solo CPU. Sei tu che guidi il gioco, quindi sai cosa, quando e quanto scrivi.
concordo con Mercyful sul fatto che aument tmp di valori sempre crescenti (tmp +0, tmp + 1, ..., tmp + s -1). Ma visto che ora usi il memcpy il problema non sussiste piu'.
Su fread e fwrite, non ci puoi fare nulla, IMHO, perche' tu chiedi al S.O. di leggere e scrivere, ma e' lui che gestisce l'HW a basso livello e quindi la bufferizzazione.
La cosa migliore che puoi fare in questo caso e' allinearti con la misura del buffer e leggere e scrivere blocchi di tale dimensione (ora non so nello specifico caso come si comporta il tuo programma).
L'unico consiglio che ti posso dare io e' di non pulire il buffer: a cosa serve? Sprechi solo CPU. Sei tu che guidi il gioco, quindi sai cosa, quando e quanto scrivi.
- FireEater
- Linux 3.x
- Messaggi: 508
- Iscritto il: sab 5 feb 2005, 0:00
- Nome Cognome: Giuseppe M.
- Slackware: Current
- Kernel: 2.6.32.7-smp
- Desktop: kde 4.3.4
- Località: Cagliari <---> Torino
Re: Realizzare buffer scrittura [c/c++]
@spina: Ho fatto delle prove, ma superando i 4KB le prestazioni degradano, credo che sia una questione di registri e di linee di cache.
@mercyful: l'errore tmp = tmp + t; è scaturito dal fatto che ho reso più leggibile l'algoritmo quando l'ho postato sul forum. Non ho mai compilato quell'istruzione, quella originale era: *(outbuffer+buffersize+t) = *(b+t)
Come già detto con memcpy va leggermente più veloce.
La versione di memcpy che hai postato preferisco non usarla perchè sarebbe da rivedere per i 64bit. Comunque se non dovessi riuscire a concludere con il file mapping la riprenderò.
@kreen: Ho visto che 4KB sono la soluzione ideale. La pulizia del buffer era solo una prova (insensata), ho provveduto ad eliminarla giorni fa, grazie
@tutti:
Sto provando la strada del file mapping, espongo il problema:
Se mappo una zona di memoria di dimensione N mi ritrovo un file di dimensione N, se scrivo K Byte di dati viene scritto un file con N-K zeri.
Se mappo una zona di memoria di dimensione N<K non viene scritto nessun file.
Come posso superare il problema? Vorrei creare un file di dimensione pari alla dimensione dei dati che vorrei memorizzare.
FE
@mercyful: l'errore tmp = tmp + t; è scaturito dal fatto che ho reso più leggibile l'algoritmo quando l'ho postato sul forum. Non ho mai compilato quell'istruzione, quella originale era: *(outbuffer+buffersize+t) = *(b+t)
Come già detto con memcpy va leggermente più veloce.
La versione di memcpy che hai postato preferisco non usarla perchè sarebbe da rivedere per i 64bit. Comunque se non dovessi riuscire a concludere con il file mapping la riprenderò.
@kreen: Ho visto che 4KB sono la soluzione ideale. La pulizia del buffer era solo una prova (insensata), ho provveduto ad eliminarla giorni fa, grazie
@tutti:
Sto provando la strada del file mapping, espongo il problema:
Se mappo una zona di memoria di dimensione N mi ritrovo un file di dimensione N, se scrivo K Byte di dati viene scritto un file con N-K zeri.
Se mappo una zona di memoria di dimensione N<K non viene scritto nessun file.
Come posso superare il problema? Vorrei creare un file di dimensione pari alla dimensione dei dati che vorrei memorizzare.
FE
- kreen
- Linux 2.x
- Messaggi: 228
- Iscritto il: mer 1 feb 2006, 18:32
- Slackware: 12.0
- Kernel: 2.6.21.5-smp
- Desktop: KDE
- Località: Verona
Re: Realizzare buffer scrittura [c/c++]
Non ho capito cosa vuoi dire, per piacere, puoi spiegarti meglio?
Ciao
Ciao
Sto provando la strada del file mapping, espongo il problema:
Se mappo una zona di memoria di dimensione N mi ritrovo un file di dimensione N, se scrivo K Byte di dati viene scritto un file con N-K zeri.
Se mappo una zona di memoria di dimensione N<K non viene scritto nessun file.
Come posso superare il problema? Vorrei creare un file di dimensione pari alla dimensione dei dati che vorrei memorizzare.
- FireEater
- Linux 3.x
- Messaggi: 508
- Iscritto il: sab 5 feb 2005, 0:00
- Nome Cognome: Giuseppe M.
- Slackware: Current
- Kernel: 2.6.32.7-smp
- Desktop: kde 4.3.4
- Località: Cagliari <---> Torino
Re: Realizzare buffer scrittura [c/c++]
Hai ragione rileggendo ho capito poco anche io.
Veniamo al dunque:
Codice: Seleziona tutto
HANDLE hFile = CreateFile("profilerfileB.log",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
DWORD dwFileMapSize = 8192;
HANDLE MappingHandle = CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
dwFileMapSize,
NULL
);
CloseHandle( hFile );
BaseAddress = MapViewOfFile(
MappingHandle,
FILE_MAP_WRITE,
0,
0,
0
);
Se ho un dwFileMapSize = 8KB e scrivo una quantità di dati K < = 8KB otterrò sempre un file di 8KB riempito di zeri nella parte finale (8-K).
Se cerco di scrivere una quantità di dati > dwFileMapSize ottengo un'eccezione e non crea nessun file.
FE