StringBuilder

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message 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 :)
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message 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
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: StringBuilder

Message par celtic88 »

mon test :

pc specs:
amd 8 core x64 / 3.1 g / Overclocked :lol:
ram 16 go / 1600
widows 7 x64

programme compiler en 64 bit

avec ta méthode je laisse la photo parle :D
Image

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.")
.....i Love Pb :)
Avatar de l’utilisateur
celtic88
Messages : 309
Inscription : sam. 12/sept./2015 14:31
Localisation : Alger

Re: StringBuilder

Message 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 :lol:
.....i Love Pb :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: StringBuilder

Message 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.
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message par Brayane »

Dobro, tu raconte n'importe quoi :roll: :wink:

T'as testé le code au lieu de dire des bêtise, non parce que sinon excuse-moi hein :wink:
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 ? :mrgreen:
Dernière modification par Brayane le lun. 21/sept./2015 0:16, modifié 2 fois.
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message 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 :)
Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message 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 :lol:

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 :)
Avatar de l’utilisateur
TazNormand
Messages : 1294
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: StringBuilder

Message par TazNormand »

Code : Tout sélectionner

FreeMemory(*Tampon)
Toujours nettoyer la cuvette après avoir fait ses besoins :mrgreen:

Bon, je sais c'est pas très poétique comme méthaphore, désolé :oops:
Image
Image
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: StringBuilder

Message 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 8O
Moi je te félicite, de ta progression et te remercie de ton partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: StringBuilder

Message par Micheao »

et il sert à quoi ce code
Micheao
Messages : 533
Inscription : dim. 07/déc./2014 10:12
Localisation : Sud-Est

Re: StringBuilder

Message 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
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: StringBuilder

Message 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")

Brayane
Messages : 54
Inscription : jeu. 27/août/2015 14:08

Re: StringBuilder

Message 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 8O
Moi je te félicite, de ta progression et te remercie de ton partage 8)
Kcc :lol:
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 8O
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: StringBuilder

Message 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 ... 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre