Page 1 sur 1
Quad rapide
Publié : lun. 12/févr./2018 13:48
par SPH
Salut,
je cherche a faire une routine la plus rapide possible. J'ai pompé la doc mais je me disais que peut etre avec des pointeurs ou je ne sais quelles joyeusetés de PB, on pouvais faire mieux ? :
Code : Tout sélectionner
If ReadFile(0, "d:\quad\1.avi") ; Si le fichier peut être lu , on continue...
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
ReadQuad(0) ; Affiche ligne par ligne le contenu du fichier
Wend
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
MessageRequester("Information","Impossible d'ouvrir le fichier!")
EndIf
Re: Quad rapide
Publié : lun. 12/févr./2018 14:32
par SPH
Je demande ca car j'ai cette impression de vitesse enorme quand c'est codé en C (ou autres)...
Re: Quad rapide
Publié : lun. 12/févr./2018 15:21
par Ar-S
ça me prend
45ms pour un fichier de 20mo.. si tu donnes pas de referents ni sur la taille de ton avi ni sur ton chrono on est mal barré pour comparer.
6983ms pour un fichier de 688mo
Je trouve ça plutôt rapide
Code : Tout sélectionner
DisableDebugger
start = ElapsedMilliseconds()
If ReadFile(0, "G:\CLIP\Eddy de Pretto - Fête de trop (Clip Officiel) [720p].mp4") ; Si le fichier peut être lu , on continue...
While Eof(0) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
ReadQuad(0) ; Affiche ligne par ligne le contenu du fichier
Wend
t = ElapsedMilliseconds()-start
MessageRequester("t",Str(t))
CloseFile(0) ; Ferme le fichier précédemment ouvert
Else
MessageRequester("Information","Impossible d'ouvrir le fichier!")
EndIf
Re: Quad rapide
Publié : lun. 12/févr./2018 15:42
par SPH
Maintenant que tu as des references de temps, penses tu qu'il y a une routine plus rapide que celle de la doc ?
(asm)??
Re: Quad rapide
Publié : lun. 12/févr./2018 15:54
par Ar-S
Je ne connais pas l'asm..
Re: Quad rapide
Publié : lun. 12/févr./2018 23:59
par nico
Oui, il y a plus rapide en affectant directement les données à un tableau comme ceci:
Code : Tout sélectionner
DisableDebugger
; Ce test crée un fichier dont la taille est un multiple de 8, il faudra donc penser à adapter le code
; Création d'un fichier pour le test, prendra un certain temps, soyez patient.
If CreateFile(0, "c:\test.txt")
For a=0 To 99999999 ; ecriture d'un fichier de (781250 ko soit lus de 781Mo)
WriteQuad(0,a)
Next a
CloseFile(0)
EndIf
start = ElapsedMilliseconds()
Dim tableau.q(0)
If ReadFile(1, "c:\test.txt") ; Si le fichier peut être lu , on continue...
longueur=(Lof(1)/8)-1
ReDim tableau(longueur)
ReadData(1, @tableau(), Lof(1))
; Affectation quasi instantanée, soit un tiers de seconde!!!
; ces lignes ne servent que pour vérifier éventuellement le contenu
; For a=0 To 10 ;que les 10 premiers sinon mettre la variable longueur
; Debug tableau(a)
; Next a
CloseFile(1)
t = ElapsedMilliseconds()-start
MessageRequester("t",Str(t))
Else
MessageRequester("Information","Impossible d'ouvrir le fichier!")
EndIf
Re: Quad rapide
Publié : mar. 13/févr./2018 3:07
par Ollivier
J'ai threadé en 16 morceaux. Ça me semble encore plus rapide.
Code : Tout sélectionner
;**********************************************************************************************************************************************************************************************************************************************************
#ThQ = 16
fName.S = "C:\test.txt"
If 0 ; <<<< creer le fichier dans un premier temps en mettant 1
If CreateFile(0, fName)
For a = 0 To 99999999
WriteQuad(0, a)
Next
EndIf
End
EndIf
fsize = FileSize(fName)
startNico0 = ElapsedMilliseconds()
Dim tableau.q(0)
If ReadFile(1, fName)
longueur = (Lof(1) / 8) - 1
ReDim tableau(longueur)
ReadData(1, @tableau(), Lof(1) )
CloseFile(1)
Else
MessageRequester("", "ProblèmeN")
EndIf
tNico0 = ElapsedMilliseconds() - startNico0
startOlli = ElapsedMilliseconds()
Structure Buff2
fid.I
*x
name.S
fpos.I
fpart.I
ok.I
EndStructure
Procedure ready(*a.Buff2)
*a\fid = ReadFile(#PB_Any, *a\Name, #PB_File_SharedRead)
If *a\fid
FileSeek(*a\fid, *a\fpos)
ReadData(*a\fid, *a\x, *a\fpart)
CloseFile(*a\fid)
Else
MessageRequester("", "Problème")
EndIf
*a\ok = 1
EndProcedure
*x = AllocateMemory(fsize, #PB_Memory_NoClear)
#ThMax = #ThQ - 1
part = (fsize + #ThMax) / #ThQ
Dim *f.Buff2(#ThMax)
For I = 0 To #ThMax
*f(I) = AllocateMemory(SizeOf(Buff2) )
*f(I)\Name = fName
*f(I)\fpart = part
*f(I)\fpos = part * I
*f(I)\x = *x + (part * I)
CreateThread(@ready(), *f(I) )
Delay(1)
Next
Structure QuadGran
Q.Q[1000000000]
EndStructure
Define *n.QuadGran = *x
recheck:
Delay(1)
For I = 0 To #ThMax
If *f(I)\ok = 0
Goto recheck
EndIf
Next
tOlli = ElapsedMilliseconds() - startOlli
startNico = ElapsedMilliseconds()
Dim tableau.q(0)
If ReadFile(1, fName)
longueur = (Lof(1) / 8) - 1
ReDim tableau(longueur)
ReadData(1, @tableau(), Lof(1) )
CloseFile(1)
Else
MessageRequester("", "ProblèmeN")
EndIf
tNico = ElapsedMilliseconds() - startNico
dv = 4
sb = 8
MessageRequester("t", "Delta Nico test 1 = " + Str(tNico0) + Chr(10) + "Delta Olli test 2 = " + Str(tOlli) + Chr(10) + "Delta Nico test 3 = " + Str(tNico)+ Chr(10) + Str(tableau(fsize / 8 - sb) ) + Chr(10) + Str(*n\Q[fsize / 8 - sb] ) )
Re: Quad rapide
Publié : mar. 13/févr./2018 13:45
par SPH
Merci, je regarde ca

Re: Quad rapide
Publié : mer. 14/févr./2018 17:36
par SPH
En effet, c'est beauuuucoup plus rapide !!
Merci a vous 2
