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 8)

Re: Quad rapide

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