Optimisation de code ReadByte et WriteByte vb

Résolu
jboss38
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
- 15 mai 2016 à 16:05
jboss38
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016
- 17 mai 2016 à 21:15
Bonjour,

Je développe un petit bout de code qui permet de lire un ficher byte par byte puis de l’écrire dans un nouveau fichier créé préalablement.
Je voulais savoir si je pouvais optimiser ce code pour que le traitement soit plus rapide, en effet il faut bien 5 minutes au-delà de 20Mo de fichier.

Voici mon bout de code:

Using file As New IO.FileStream(SrcFile, IO.FileMode.Open)
Using fileCrpt As New IO.FileStream(cryptName, IO.FileMode.Open)
For i As Integer = 0 To dataArray.Length - 1
dataArray(i) = file.ReadByte()
HexResult = dataArray(i).ToString("X2")
cryptHex = crypt(HexResult)
fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex)))
EndOfCryptBar.Value = i
Next i

End Using
End Using


Comme vous l'avez vu il y a une conversion mais cela n'affecte pas la durée, j'ai essayé sans c'est pareil.
Voilà j’espère que vous pourrez m'aider à optimiser ce code (si c'est possible)

Ce qui me prend beaucoup de ressources c'est le tableau dataArray qui prend la même taille que le fichier source j'ai essayé de la purger au fur et à mesure mais je n'y arrive pas, je mets juste la valeur du tableau en empty.
( dataArray(i - 1) = vbEmpty )

Merci d'avance !

2 réponses

NHenry
Messages postés
14941
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
20 juin 2022
161
15 mai 2016 à 16:34
Ce que tu peux faire déjà c'est au lieu de faire une lecture/écriture octet/octet c'est déjà de prendre plusieurs octets d'un coup.

Ensuite, dimensionne ton tableau à la taille de ta lecture, effectue le chiffrement sur le tableau puis écrit le contenu du tableau.

Regardes les méthodes Write et Read des flux binaires.
0
jboss38
Messages postés
829
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
14 décembre 2016

Modifié par jboss38 le 15/05/2016 à 21:40
Ok j'ai gagner un peu de vitesse, c'était a cause de mon comptage I.

J'ai fait autrement c'est beaucoup plus rapide, mais je sens que ce n'est pas encore la meilleur façon de faire !

Je fais par paquet de 4096 bytes de tableau

Do Until file.Position >= file.Length
If FilesrcLen < 4095 Then
DataLeng = FilesrcLen - 1
Else
DataLeng = "4095"
FilesrcLen = FilesrcLen - 4096
End If
Dim dataArray(DataLeng) As Byte
For i As Integer = 0 To dataArray.Length - 1
dataArray(i) = file.ReadByte()
HexResult = dataArray(i).ToString("X2")
cryptHex = crypt(HexResult)
fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex)))
'vCount = vCount + 1
Next i
EndOfCryptBar.Value = file.Position
Loop




Membre
0
NHenry
Messages postés
14941
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
20 juin 2022
161
15 mai 2016 à 23:45
A la place de lire octet par octet, charge toute une partie du fichier (fonctions Reab et Write).

De plus, une perte de temps peut se passer dans ton fonction de chiffrement.
0
jboss38 > NHenry
Messages postés
14941
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
20 juin 2022

16 mai 2016 à 10:30
Du coup, est-ce que tu pensais a qqc comme ça :

Do Until file.Position >= file.Length
If FilesrcLen < 4095 Then
DataLeng = FilesrcLen - 1
Else
DataLeng = "4095"
FilesrcLen = FilesrcLen - 4096
End If
Dim dataArray(DataLeng) As Byte
cryptHex = ""
For i As Integer = 0 To dataArray.Length - 1
dataArray(i) = file.ReadByte()
HexResult = dataArray(i).ToString("X2")
cryptHex = cryptHex + crypt(HexResult)
'vCount = vCount + 1
Next i
fileCrpt.WriteByte(CByte(Conversion.Val("&H" & cryptHex)))
EndOfCryptBar.Value = file.Position
Loop


Le code lit chaque octet mais écrit tous les 4096 octet
0
NHenry
Messages postés
14941
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
20 juin 2022
161 > jboss38
16 mai 2016 à 12:22
0
Malheureusement ma fonction de cryptage ce fait Octet par Octet.

Je vais donc regarde ce que je peux faire.
0
vb95
Messages postés
2775
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
30 juin 2022
151 > jboss38
Modifié par vb95 le 16/05/2016 à 17:18
soit un fichier de 8192 octets
un tableau de 4096 octets par exemple
tu lis 4096 octets d'un seul coup avec Read(tableau,offset,nombreoctets)
ton cryptage tu le fais sur le tableau directement et non sur la lecture de chaque octet
tu fais le traitement 2 fois par une boucle
si le fichier fait 8194 octets par exemple un
8194 Mod 4096

te donne 2 comme résultat
donc en fin de tes 2 boucles de 8192 tu sais qu'il te reste encore 2 octets à traiter ( tout cela pour t'expliquer comment déduire si il faut une dernière boucle pour les derniers octets et le nombre de ces derniers octets à traiter) . si l'opération Mod donne 0 comme résultat il n'y a pas de dernière boucle supplémentaire vu que la taille du fichier est un multiple de la taille du tableau
De plus Val est une instruction VB6 gardé par compatibilité : son équivalent net est bien plus performant : Convert.ToByte pour un octet ( voir ton aide VB Net pour cela
0