Realizzare buffer scrittura [c/c++]

Forum dedicato alla programmazione.

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.
Avatar utente
targzeta
Iper Master
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++]

Messaggio da targzeta »

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
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
Mercyful
Linux 1.x
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++]

Messaggio da Mercyful »

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!

Avatar utente
kreen
Linux 2.x
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++]

Messaggio da kreen »

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.

Avatar utente
FireEater
Linux 3.x
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++]

Messaggio da FireEater »

@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 :thumbright:

@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

Avatar utente
kreen
Linux 2.x
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++]

Messaggio da kreen »

Non ho capito cosa vuoi dire, per piacere, puoi spiegarti meglio?

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.

Avatar utente
FireEater
Linux 3.x
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++]

Messaggio da FireEater »

:oops: :oops: :oops:
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
                    );
dwFileMapSize dovrebbe essere la dimensione della zona di memoria che viene mappata per contenere il file. Dato che si tratta di sola scrittura io non ho idea di quale sarà la dimensione finale del file (è come se l'utente premesse il tasto record di un recorder, se ferma la registrazione dopo un'ora il file può superare il GB).

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

Rispondi