Page 2 sur 3
Re: StringBuilder
Publié : dim. 20/sept./2015 18:45
par Brayane
Et bien je suis heureux d'avoir contribuer même si je sais que ce code est loin d'être optimiser.
Si vous définissez la taille avent utilisation (Ceci évite les ré-allocation de mémoire à la chaîne), cela aura pour conséquence une rapidité considérable, exemple:
Code : Tout sélectionner
Abc$ = "Abcdefghijklmnopqrstuvwxyz"
If InitialiseStringBuilder(260000000) And IsStringBuilder()
MessageRequester("StringBuilder Initialisation...", "StringBuilder Memory ID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()))
Time1 = ElapsedMilliseconds()
For I = 1 To 10000000
MemoryID = StringBuilderGetMemoryID()
MemorySize = StringBuilderGetMemorySize()
MemoryRemaining = StringBuilderGetMemoryRemaining()
MemoryPosition = StringBuilderGetMemoryPosition()
OctetsWrite = StringBuilderAddString(Abc$)
Next
Time2 = ElapsedMilliseconds()
MessageRequester("StringBuilder Résultat...", "StringBuilder Memory ID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()) + Chr(13) + Chr(10) +
"StringBuilder Last Octets Write = " + Str(OctetsWrite) + Chr(13) + Chr(10) +
"Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
Else
MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n'a pas put être initialisé !", 16)
EndIf
Chez moi, env 3,3 secondes seulement !
Si vous ne mettez pas de taille, alors le programme réaloura constamment de la mémoire s'il n'en à pas assez, ceci ralentie considérablement le programme !
Désactivé le débogueur aussi pour le test

Re: StringBuilder
Publié : dim. 20/sept./2015 19:06
par Brayane
Autre petit exemple:
Code : Tout sélectionner
Abc$ = "Abc"
If InitialiseStringBuilder() And IsStringBuilder()
MessageRequester("StringBuilder Initialisation...", "StringBuilder Memory ID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()))
Time1 = ElapsedMilliseconds()
For I = 1 To 100
MemoryID = StringBuilderGetMemoryID()
MemorySize = StringBuilderGetMemorySize()
MemoryRemaining = StringBuilderGetMemoryRemaining()
MemoryPosition = StringBuilderGetMemoryPosition()
OctetsWrite = StringBuilderAddString(Abc$ + " - " + Str(I))
Debug "StringBuilder Memory ID = " + Str(MemoryID)
Debug "StringBuilder Memory Size = " + Str(MemorySize)
Debug "StringBuilder Memory Remaining = " + Str(MemoryRemaining)
Debug "StringBuilder Memory Position = " + Str(MemoryPosition)
Debug "StringBuilder Last Octets Write = " + Str(OctetsWrite)
Debug "Texte Write = " + Abc$ + " - " + Str(I)
Debug "-------------------------------------------------"
Next
Time2 = ElapsedMilliseconds()
MessageRequester("StringBuilder Résultat...", "StringBuilder Memory ID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()) + Chr(13) + Chr(10) +
"StringBuilder Last Octets Write = " + Str(OctetsWrite) + Chr(13) + Chr(10) +
"Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
Else
MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n'a pas put être initialisé !", 16)
EndIf
Re: StringBuilder
Publié : dim. 20/sept./2015 22:30
par celtic88
mon test :
pc specs:
amd 8 core x64 / 3.1 g / Overclocked
ram 16 go / 1600
widows 7 x64
programme compiler en 64 bit
avec ta méthode je laisse la photo parle
et voilla une autrs méthode simple et plus rapide,,, environ 2600000 caractère en 14 ms
Code : Tout sélectionner
Abc$ = "Abcdefghijklmnopqrstuvwxyz"
Time1 = ElapsedMilliseconds()
*OctetsWrite = AllocateMemory((100000 * StringByteLength(Abc$)) + 100000)
For I = 1 To 100000
PokeS(*OctetsWrite, Abc$)
*OctetsWrite + StringByteLength(Abc$) + 1
Next
Time2 = ElapsedMilliseconds()
MessageRequester("normal Résultat...","Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
Re: StringBuilder
Publié : dim. 20/sept./2015 22:38
par celtic88
et son aucun des deux methode la joor comme ca
Code : Tout sélectionner
Abc$ = "Abcdefghijklmnopqrstuvwxyz"
Time1 = ElapsedMilliseconds()
For I = 1 To 100000
OctetsWrite$ + Abc$
Next
Time2 = ElapsedMilliseconds()
MessageRequester("normal Résultat...","Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
après 10 minutes de travail sons arrêt et mon processeur aux max

, j'étais obligé de le fermer manuellement c i non mon pc va exploser

Re: StringBuilder
Publié : dim. 20/sept./2015 23:22
par nico
@Dobro, il y a bien une concaténation, pour afficher le résultat, faire Debug StringBuilderGetString().
@Celtic, oui, c'est complètement ouf la différence.
Re: StringBuilder
Publié : dim. 20/sept./2015 23:49
par Brayane
Dobro, tu raconte n'importe quoi
T'as testé le code au lieu de dire des bêtise, non parce que sinon excuse-moi hein
C'est bien de critiquer mais c'est bien aussi de tester le code hein ?
Car si tu ne fais que critiquer sans rien tester c'est comme si tu disais que se que je fais c'est de la crotte avant même de testé, donc merci hein !
Bref, voici deux autre exemple pour te montrer se que ça donne:
Code : Tout sélectionner
Abc$ = "Abcdefghijklmnopqrstuvwxyz"
If InitialiseStringBuilder(26000000) And IsStringBuilder()
MessageRequester("StringBuilder Initialisation...", "StringBuilder Memory ID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()))
Time1 = ElapsedMilliseconds()
For I = 1 To 1000000
MemoryID = StringBuilderGetMemoryID()
MemorySize = StringBuilderGetMemorySize()
MemoryRemaining = StringBuilderGetMemoryRemaining()
MemoryPosition = StringBuilderGetMemoryPosition()
OctetsWrite = StringBuilderAddString(Abc$)
Next
Time2 = ElapsedMilliseconds()
MessageRequester("StringBuilder Résultat...", "StringBuilder Memory ID = " + Str(StringBuilderGetMemoryID()) + Chr(13) + Chr(10) +
"StringBuilder Memory Size = " + Str(StringBuilderGetMemorySize()) + Chr(13) + Chr(10) +
"StringBuilder Memory Remaining = " + Str(StringBuilderGetMemoryRemaining()) + Chr(13) + Chr(10) +
"StringBuilder Memory Position = " + Str(StringBuilderGetMemoryPosition()) + Chr(13) + Chr(10) +
"StringBuilder Last Octets Write = " + Str(OctetsWrite) + Chr(13) + Chr(10) +
"Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
Else
MessageRequester("StringBuilder Résultat...", "Erreur, Le StringBuilder n'a pas put être initialisé !", 16)
EndIf
OpenFile(0, "Test.txt")
WriteString(0, StringBuilderGetString())
CloseFile(0)
MessageRequester("", "Fini !")
Chez moi débogueur désactivé ça met env 1 Sec.
Dobro, tient pour toi:
Code : Tout sélectionner
Time1 = ElapsedMilliseconds()
For I = 1 To 1000000
A$ + "Abcdefghijklmnopqrstuvwxyz"
Next
Time2 = ElapsedMilliseconds()
MessageRequester("StringBuilder Résultat...", "Time Elapsed = " + Str(Time2 - Time1) + " Ms.")
OpenFile(0, "Test.txt")
WriteString(0, A$)
CloseFile(0)
MessageRequester("", "Fini !")
Le quel code est plus rapide, le deuxième je suppose ?

Re: StringBuilder
Publié : lun. 21/sept./2015 0:15
par Brayane
Nico, ya rien de Ouf là dans je pense, c'est simplement que:
Chaque fois que vous utilisez l'une des méthodes de la classe System.String (Ici l'objet String quoi, les variables), vous créez un nouvel objet
chaîne en mémoire, ce qui requiert une nouvelle allocation d'espace pour ce nouvel objet.
Donc forcément ça ralentie beaucoup le programme !
Avec mon code, deux option:
1) - Tu met les chaînes à la suite dans la mémoire en réalouant celle-ci si elle n'est
pas suffisante pour stocker le nouveau contenue (avec une marge de 9 fois le contenue Pour faire un petit tampon)
Cette méthode est bien mais lente surtout avec de petit contenue !
2) - Tu calcule la taille totale que va prendre ton objet String puis tu alloue la mémoire en fonctionne de la taille de cet objet String
puis tu y engouffre à la suite les contenues de ton String.
Beaucoup plus rapide puisque ne réaloue pas à la chaîne de la mémoire.
Cette méthode est à ma connaissance la plus rapide qui soit pour stoker à la chaîne à la suite des chaîne de caractères.
Voila

Re: StringBuilder
Publié : lun. 21/sept./2015 0:24
par Brayane
celtic88, oui ton code est encore plus rapide que moi mais ta aucune sécurité sur ta mémoire, c'est très galère à gérer
et un débutant ne sais pas faire et même un type lambda ne saurais peut être pas faire...
Se que je veux dire c'est que c'est chiant la mémoire, regarde je viens juste de piger tous seule comment ça marchais, en faisant un tuto sur la mémoire.
C'est pas la première fois que je fais quelque chose du style, d’apprendre seule en faisant un tuto
Comme quoi faire un tuto ça sert d’abord à soit même avant d'apprendre aux autres XD.
Ma méthode est un peu moins rapide mais similaire à la tienne, même principe
Et puis les copains, y m'ont aidé aussi ou sinon j'y serait encore !
Seulement avec mon code, normalement aucune erreur possible, j'ai bien dis "normalement".
Parce que je ne gère pour le moment pas encore certaine option du style #PB_UTF8 et #PB_Unicode.
Tous est en Ascii avec mon code.
Mais ont va améliorer tous ça petit à petit

Re: StringBuilder
Publié : lun. 21/sept./2015 8:14
par TazNormand
Toujours nettoyer la cuvette après avoir fait ses besoins
Bon, je sais c'est pas très poétique comme méthaphore, désolé
Re: StringBuilder
Publié : lun. 21/sept./2015 8:55
par Kwai chang caine
En attendant le BRAYANE à force de se masturber le cerveau jour et nuit avec des codes de "ouf" pas toujours utiles....
Ca a l'avantage de le faire devenir super bon

Moi je te félicite, de ta progression et te remercie de ton partage

Re: StringBuilder
Publié : lun. 21/sept./2015 9:23
par Micheao
et il sert à quoi ce code
Re: StringBuilder
Publié : lun. 21/sept./2015 9:44
par Micheao
Merci pour l'explication Spock mais quel intérêt de faire ce code à part que si on a un projet d'application
Re: StringBuilder
Publié : lun. 21/sept./2015 9:58
par G-Rom
Code : Tout sélectionner
a$="Abcdefghijklmnopqrstuvwxyz"
TempsDepart = ElapsedMilliseconds()
For i=1 To 10000
z$=z$+a$
Next i
TempsEcoule= ElapsedMilliseconds()-TempsDepart
MessageRequester("temp concatenation de base", "Time Elapsed = " + Str(TempsEcoule) + " Ms")
TempsDepart = ElapsedMilliseconds()
G$ = Space(Len(a$)*10000)
*ptr = @G$
offset = 0
For i=1 To 10000
For j = 0 To Len(a$)-1
PokeA(*ptr+offset, Asc(Mid(a$,j+1,1)))
offset+1
Next
Next
TempsEcoule= ElapsedMilliseconds()-TempsDepart
MessageRequester("temp copie par caractère", "Time Elapsed = " + Str(TempsEcoule) + " Ms")
TempsDepart = ElapsedMilliseconds()
G2$ = Space(Len(a$)*10000)
*ptr = @G2$
offset = 0
For i=1 To 10000
CopyMemory(@a$,*ptr+offset,Len(a$))
offset + Len(a$)
Next
TempsEcoule= ElapsedMilliseconds()-TempsDepart
MessageRequester("temp G2$ , copie par bloc", "Time Elapsed = " + Str(TempsEcoule) + " Ms")
Re: StringBuilder
Publié : lun. 21/sept./2015 10:00
par Brayane
Kwai chang caine a écrit :En attendant le BRAYANE à force de se masturber le cerveau jour et nuit avec des codes de "ouf" pas toujours utiles....
Ca a l'avantage de le faire devenir super bon

Moi je te félicite, de ta progression et te remercie de ton partage

Kcc
Non non, je ne suis pas du tous super bon, pas du tout, c'est rien ça par apport à se que certain font.
Mais il est vraie que j’apprends, que ce soit utile ou pas

Très heureux que ça plaise, c'est bien la première fois

Re: StringBuilder
Publié : lun. 21/sept./2015 10:13
par Kwai chang caine
Micheao a écrit :Merci pour l'explication Spock mais quel intérêt de faire ce code à part que si on a un projet d'application
bah !!! ya des centaines de codes sur les forums qui n'ont d'autres but que d'exister.
La recherche de la rapidité se suffit à elle même ...
Un code sans application peut servir aussi de départ à un autre code, de réflexion, d'entraînement, de passe temps, de compréhension d'une technologie, d'une pratique, etc...que sais je encore...
Si il n'est pas faux et fonctionne, c'est toujours utile, un jour ou l'autre. ..
Certains codes n'ont pas d'autres utilité que de participer à un concours, comme purepunch, et tu ne pose pas cette question. ..
Elle est bizarre ta question et quelque peu irrespectueuse pour son créateur ...
