Si voulez faire le test, suivez cette ordre :
1/ Creation d'un fichier test nommé Origine.txt de 500000 lignes, Voici le code :
*** Pour purebasic 4 :
Code : Tout sélectionner
Fichcible$="Origine.txt" : Temp$=""
Maxtab.l=500000 : Boucle.l=0
Res= CreateFile(#PB_Any, Fichcible$)
If Res
DebutTemps.l=ElapsedMilliseconds()
For Boucle=1 To Maxtab
Temp$=LSet("", 80, Chr(Random(30)+66))
WriteStringN(Res,Temp$)
Next Boucle
FinTemps.l=ElapsedMilliseconds()
VarTemp.l=(FinTemps-DebutTemps)/1000
MessageRequester("Information","Traitement Effectué En : "+Str(VarTemp)+" Secondes...",#PB_MessageRequester_Ok)
CloseFile(Res)
EndIf
End
Code : Tout sélectionner
Fichcible$="Origine.txt" : Temp$=""
Maxtab.l=500000 : Boucle.l=0
Res= CreateFile(#PB_Any, Fichcible$)
If Res
DebutTemps.l=ElapsedMilliseconds()
For Boucle=1 To Maxtab
Temp$=LSet("", 80, Chr(Random(30)+66))
UseFile(Res) : WriteStringN(Temp$)
Next Boucle
FinTemps.l=ElapsedMilliseconds()
VarTemp.l=(FinTemps-DebutTemps)/1000
MessageRequester("Information","Traitement Effectué En : "+Str(VarTemp)+" Secondes...",#PB_MessageRequester_Ok)
CloseFile(Res)
EndIf
End
2/ Le code suivant lit sequentiellement le fichier Origine.txt qui contient 500000 lignes mais pas seulement, plus de details en bas...
*** Pour purebasic 4 :
Code : Tout sélectionner
RT$=Chr(#CR) : Fichcible$="Origine.txt" : Fichdest$="Resultas.txt"
Maxtab.l=500000 : Cmp.l=0 : Cmp2.l = 0 : Etat.l=0 : Boucle.l=0 : Crc.l=0
Res = ReadFile(#PB_Any, Fichcible$)
If Res
Res2= CreateFile(#PB_Any, Fichdest$)
Dim Tab.l(Maxtab) : Posit.l=0 : DebutTemps.l=ElapsedMilliseconds()
Repeat
ChaineLU$=ReadString(Res)
If Len(ChaineLU$)>0
Cmp=Cmp+1 : Crc=CRC32Fingerprint(@ChaineLU$, Len(ChaineLU$))
If Cmp>Maxtab
MessageRequester("Information","Desolé, depassement de capacité... ligne trouvée(s) superieur a "+Str(Maxtab)+" dans le fichier "+Fichcible$+" !!! - ARRET DU PROGRAMME...",#PB_MessageRequester_Ok)
End
EndIf
Etat=0 : For Boucle=1 To Cmp2 : If Tab(Boucle)=Crc : Etat=1 : Break : EndIf : Next Boucle
If Etat=0 : Cmp2=Cmp2+1 : Tab(Cmp2)=Crc : WriteStringN(Res2, ChaineLU$) : EndIf
EndIf
Until Eof(Res)
FinTemps.l=ElapsedMilliseconds() : TempEcoule$=Str((FinTemps-DebutTemps)/1000)
CloseFile(Res2)
Else
MessageRequester("Information","Desolé, une erreur s'est produite lors de l'acces au fichier "+Fichcible$+" !"+RT$+RT$+"Arret du programme...",#PB_MessageRequester_Ok)
End
EndIf
CloseFile(Res)
If Cmp>0 And Cmp2>0
MessageRequester("Information","Nombre de ligne trouvé(s) dans le fichier "+Fichcible$+" : "+Str(Cmp)+RT$+RT$+"Resultas dans le fichier destination "+Fichdest$+" : "+Str(Cmp2)+RT$+RT$+RT$+"Traitement Effectué En : "+TempEcoule$+" Secondes...",#PB_MessageRequester_Ok)
Else
DeleteFile(Fichdest$)
EndIf
End
Code : Tout sélectionner
RT$=Chr(#CR) : Fichcible$="Origine.txt" : Fichdest$="Resultas.txt"
Maxtab.l=500000 : Cmp.l=0 : Cmp2.l = 0 : Etat.l=0 : Boucle.l=0 : Crc.l=0
Res = ReadFile(#PB_Any, Fichcible$)
If Res
Res2= CreateFile(#PB_Any, Fichdest$)
Dim Tab.l(Maxtab) : Posit.l=0 : DebutTemps.l=ElapsedMilliseconds()
Repeat
UseFile(Res) : ChaineLU$=ReadString()
If Len(ChaineLU$)>0
Cmp=Cmp+1 : Crc=CRC32Fingerprint(@ChaineLU$, Len(ChaineLU$))
If Cmp>Maxtab
MessageRequester("Information","Desolé, depassement de capacité... ligne trouvée(s) superieur a "+Str(Maxtab)+" dans le fichier "+Fichcible$+" !!! - ARRET DU PROGRAMME...",#PB_MessageRequester_Ok)
End
EndIf
Etat=0 : For Boucle=1 To Cmp2 : If Tab(Boucle)=Crc : Etat=1 : Break : EndIf : Next Boucle
If Etat=0 : Cmp2=Cmp2+1 : Tab(Cmp2)=Crc : UseFile(Res2) : WriteStringN(ChaineLU$) : EndIf
EndIf
Until Eof(Res)
FinTemps.l=ElapsedMilliseconds() : TempEcoule$=Str((FinTemps-DebutTemps)/1000)
CloseFile(Res2)
Else
MessageRequester("Information","Desolé, une erreur s'est produite lors de l'acces au fichier "+Fichcible$+" !"+RT$+RT$+"Arret du programme...",#PB_MessageRequester_Ok)
End
EndIf
CloseFile(Res)
If Cmp>0 And Cmp2>0
MessageRequester("Information","Nombre de ligne trouvé(s) dans le fichier "+Fichcible$+" : "+Str(Cmp)+RT$+RT$+"Resultas dans le fichier destination "+Fichdest$+" : "+Str(Cmp2)+RT$+RT$+RT$+"Traitement Effectué En : "+TempEcoule$+" Secondes...",#PB_MessageRequester_Ok)
Else
DeleteFile(Fichdest$)
EndIf
End
Si vous faite le test, et j'en suis moi meme un peu surpris, la version purebasic 4 execute le programme en pratiquement 1 a 4 secondes alors que la version pour purebasic 3 le fait en 53 secondes, j'ai pensé au depart avoir fait une erreur quelques part, mais je n'ai rien trouvé, la difference est enorme, l'auteur a fait la un travail d'optimisation apreciable...
Le test a ete effectue sur un P4 2.6
Reste a translater le code en bcx pour comparer, mais je n'ai pas vraiment le temps pour le moment, si quelqu'un veut retranscrire le code en c, je serais curieux de voir ca...