Repository 32bit  Forum
Repository 64bit  Wiki

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.

Re: Realizzare buffer scrittura [c/c++]

Messaggioda targzeta » mar lug 21, 2009 11:57

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
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6155
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: Realizzare buffer scrittura [c/c++]

Messaggioda Mercyful » mar lug 21, 2009 15:06

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
Mercyful
Linux 2.0
Linux 2.0
 
Messaggi: 196
Iscritto il: ven lug 25, 2008 17:20
Località: Torino
Nome Cognome: Ilario Pittau
Slackware: 13.0
Kernel: 2.6.29.6-generic
Desktop: xfce 4.6

Re: Realizzare buffer scrittura [c/c++]

Messaggioda kreen » gio lug 23, 2009 9:20

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
kreen
Linux 2.4
Linux 2.4
 
Messaggi: 228
Iscritto il: mer feb 01, 2006 18:32
Località: Verona
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE

Re: Realizzare buffer scrittura [c/c++]

Messaggioda FireEater » gio lug 23, 2009 13:06

@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
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Re: Realizzare buffer scrittura [c/c++]

Messaggioda kreen » sab lug 25, 2009 21:55

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
kreen
Linux 2.4
Linux 2.4
 
Messaggi: 228
Iscritto il: mer feb 01, 2006 18:32
Località: Verona
Slackware: 12.0
Kernel: 2.6.21.5-smp
Desktop: KDE

Re: Realizzare buffer scrittura [c/c++]

Messaggioda FireEater » dom lug 26, 2009 10:53

: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
Avatar utente
FireEater
Linux 2.6
Linux 2.6
 
Messaggi: 508
Iscritto il: sab feb 05, 2005 0:00
Località: Cagliari <---> Torino
Nome Cognome: Giuseppe M.
Slackware: Current
Kernel: 2.6.32.7-smp
Desktop: kde 4.3.4

Precedente

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti