Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Prestazioni di un TXT vs file Random

Lo so, basta provare, ma magari l'esperienza di qualcuno potrebbe tener
conto di condizioni ambientali che mutano e che finiscono per vanificare un
test fatto "al volo".
Ipotizzando di voler accodare (solo accodare) informazioni a un file ASCII
aperto "for append" (Print #canale, stringa) oppure al record totale+1 di un
file con records a dimensione fissa aperto con modalità random (Put #canale,
numero_record), secondo voi, con dimensioni "importanti" è più veloce il
primo o il secondo? Grazie.

 ha scritto nel messaggio
news:3MGV8.1282$K_4....@twister1.libero.it...

direi che la prima ipotesi sia piu' veloce.
penso che lasciando al SO il compito di ricavare la posizione
dove scrivere ci sia un minor uso di risorse.
naturalmente e' solo teoria!
R.

 ha scritto nel messaggio
news:3MGV8.1282$K_4....@twister1.libero.it...

secondo me il secondo...
aggiungendo righe su righe utilizzando il 'for append' mi pare di ricordare
che provochi un rallentamento progressivo, in relazione alle dimensioni del
file, cosa che non si verifica nell'accesso random. un saltello in fondo al
file ti costa pochi attimi :).
non so se corrisponda a verita', e' solo quello che mi e' sembrato di notare
nei miei prog.
ciao, assa.

 primo o il secondo? Grazie.
Senza prova, solo seguendo l'intuito (anche se a volte VB mi lascia
allibito, es:
a = InStr(1, str , str2, vbTextCompare)
è più lento di
a = InStr(1, str , LCase$(str2), vbBinaryCompare)
e
Dim v as Variant
v = v + 1 ' integer
è più lento (e molto) di
v = v + 1# ' double
quando i double sono notoriamente più lenti degli interi
)
Usando un file in Append dovrebbe teoricamente essere più veloce (è fatto
apposta!), però credo che per una perversione di VB un file aperto in questo
modo viene sottoposto a un mucchio di controlli su cosa viene appeso
(presente il trhead di questi giorni su Input#?).
Quindi dovrebbe essere più veloce il Random che scrive così com'è.
Adesso urge una verifica pratica :PPP
Ciao

Ho fatto un programma di test che accoda 200.000 records da 100 bytes l'uno
a botta (quindi 20Mb), sia sul file ASCII che su quello Random.
Creare in un form due bottoni (Command1 e Command2) e un ListBox (List1) e
incollare il codice che segue.
Il risultato, anche con dimensioni importanti è, direi, inequivocabile
(almeno con XP Pro, Ram 256Mb, HD 20Gb, VB6+SP5).
PS: Alla fine ricordatevi di cancellare i files C:\Pippo.TXT e C:\Pippo.RND
'-------------------------------------------------
Private Type mio_rec
    stringa As String * 100
End Type
Private Sub Command1_Click()
    file = "c:\pippo.TXT"
    canale = FreeFile
    Open file For Append As #canale
    ti = Timer
    For n = 1 To 200000         '20Mb
        Print #canale, String(98, "A")
    Next n
    ti = Timer - ti
    Call rapporto(canale, file, ti)
End Sub
Private Sub Command2_Click()
    Dim rec As mio_rec
    file = "c:\pippo.RND"
    canale = FreeFile
    Open file For Random As #canale Len = 100
    p_rec = (LOF(canale) / Len(rec)) + 1
    rec.stringa = String(100, "a")
    ti = Timer
    For n = p_rec To p_rec + 199999       '20Mb
        Put #canale, n, rec
    Next n
    ti = Timer - ti
    Call rapporto(canale, file, ti)
End Sub
Sub rapporto(canale, nome_file, tempo_impiegato)
    lgf = Format(LOF(canale), "###,###,###,###")
    cancella = IIf(MsgBox("Tempo " & tempo_impiegato & vbCrLf & "Il file" &
vbCrLf & nome_file & vbCrLf & "è di " & lgf & " bytes." & vbCrLf & "Cancelli
il file?", vbYesNo + vbDefaultButton2 + vbQuestion) = vbYes, 1, 0)
    List1.AddItem nome_file & vbTab & "T= " & tempo_impiegato & vbTab &
"Lung.att. " & lgf
    List1.ListIndex = List1.ListCount - 1
    Close canale
    If cancella Then Kill nome_file
End Sub

ho provato!
ed i risultati sono stati:
c:\pippo.TXT    T= 3,496094 Lung.att. 200.000.000
c:\pippo.RND    T= 2,824219 Lung.att. 200.000.000
c:\pippo.BIN    T= 1,972656 Lung.att. 200.000.000
la terza riga e' un test che ho aggiunto io, perche'
quando ho visto la differenza tra Print e Put ho pensato
che forse si poteva fare meglio.
il test aggiunto e' il seguente:
Private Sub Command3_Click()
    Dim rec As mio_rec
    File = "c:\pippo.BIN"
    canale = FreeFile
    Open File For Binary As #canale
    Seek canale, LOF(canale) + 1
    rec.stringa = String(100, "a")
    ti = Timer
    For N = 1 To 200000        '20Mb
        Put #canale, , rec
    Next N
    ti = Timer - ti
    Call rapporto(canale, File, ti)
End Sub
ma non mi sono fermato qui.
a me era sembrato che il problema fosse quello di
scrivere un singolo record, quindi il tempo da considerare e'
anche quello della Open. ho rifatto il test in modo da eseguire
open - posizionamento - scrittura - close per le solite 200000 volte
i risultati ottenuti sono:
c:\pippo.TXT    T= 70,5920000000036 Lung.att. 20.000.000
c:\pippo.RND    T= 70,9319999999975 Lung.att. 20.000.000
c:\pippo.BIN    T= 70,0209999999969 Lung.att. 20.000.000
c:\pippo.TXT    T= 53,8070000000015 Lung.att. 20.000.000
c:\pippo.RND    T= 53,4670000000029 Lung.att. 20.000.000
c:\pippo.BIN    T= 53,3569999999992 Lung.att. 20.000.000
sapete quale e' la differenza tra il primo set di risultati e il secondo?
nel primo avevo la cartella del drive C:\ aperta sul desktop!
17 secondi in piu'! cacchio (uso W2K)
saluti
R.

 c:\pippo.BIN    T= 1,972656 Lung.att. 200.000.000
Ma se a me le gestione col TXT dura circa la metà di quella con RND...?
:-(((

 :-(((
che versione di Win usi?
R. definire aleatorio Windows mi sembra eufemistico ;-(

 R. definire aleatorio Windows mi sembra eufemistico ;-(
Eggià...

C:\PIPPO.TXT  T=1.578125
C:\PIPPO.RND  T=3.492188
Voi?
--
"I grandi spiriti hanno sempre incontrato violenta
opposizione da parte delle menti mediocri."
A.Einstein

 Voi?
Ecco, appunto.
Con che sistema e memoria, Antonio?

 C:\PIPPO.RND  T=3.492188
C:\PIPPO.TXT  T=1.507813
C:\PIPPO.RND  T=1.25
come avevo scritto anche prima... deve essere proprio il mio sistema
abbastanza anomalo :P
ho fatto la prova diverse volte. i valori interi sono sempre uguali (a 1),
ma la parte decimale si dimezza con l'accesso random, che non e' molto, ma
e' gia' un miglioramento...
AMD Duron 800 + Win2k + 384Mb di ram
ciao, assa.

Ok,
io uso, W2K +SP2, 128MB, 40GB VB6+SP5
penso che il S.O. ci metta del suo!
R.

scusa, che versione di win usi?
grazie


CUT
i miei risultati
win xp pro
p4-1800
512 mb
c:\pippo.txt   t= 1.359375
c:\pippo.rnd  t= 2.15625
c:\pippo.rnd  t= 0.890625
la differenza tra i due RND ?
dopo il primo test non h cancellato il file, il secondo test
quindi ha riscritto su spazio già allocato
questo non fa pensare?
ciao Acia

 questo non fa pensare?
Effettivamente, sì.

 ha scritto nel messaggio
news:Hr0W8.7465$7N3.1...@twister2.libero.it...

nessuna modifica per ottenere detti risultati..
solo l'errore di aver risposto no anziche' si nella box
per cancellare il file
poi ho eseguito altre prove ma nessuna degna di nota
ciao Acia

 per cancellare il file
acia, se guardi bene il codice, noterai che, anche nel caso di file random,
viene preventivamente rilevato il numero dell'ultimo record e quindi la
scrittura dei nuovi records avviene realmente in coda al file, non, come hai
supposto, nella parte già scritta.

 ha scritto nel messaggio
news:6Q1W8.6291$K_4.1...@twister1.libero.it...

sono costernato....
hai ragione avevo impasticciato il codice
e tolto il posizionamento esplicito sul record
per questo il comportamento che ti ho detto!
comunque restano le mie perplessità su dove win spende
il suo tempo...
ciao

 il suo tempo...
c'č da tener conto della gestione della cache del disco....
che č un'incognita :)
ciao

xp, vb 6  + sp4 , 256 ddr, 1800+ athlon xp, 40 gb hardisk 7200rpm
monopiatto.
:o)))



Questi sono i miei risultati:
c:\pippo.TXT     T=1,082031   Lung.att.  20.000.000
c:\pippo.RND     T=1,152344   Lung.att.  20.000.000
conf: athon 1.100 win xp  512 mb ram  hd uwscsi 10k