Page 1 sur 3

StringBuilder

Publié : dim. 20/sept./2015 15:28
par Brayane
Salut, en PB, il n'y a pas de chose de type StringBuilder:

Extrait de MDSN:
L'objet String est immuable. Chaque fois que vous utilisez l'une des méthodes de la classe System.String, vous créez un nouvel objet
chaîne en mémoire, ce qui requiert une nouvelle allocation d'espace pour ce nouvel objet. Dans les cas où vous devez effectuer
des modifications répétées d'une chaîne, la surcharge associée à la création d'un nouvel objet String peut être élevée.

Vous pouvez utiliser la classe System.Text.StringBuilder pour modifier une chaîne sans créer de nouvel objet. Par exemple, l'utilisation
de la classe StringBuilder peut optimiser les performances lorsqu'il s'agit de concaténer de nombreuses chaînes dans une boucle.

J'aimerais bien en crée un, ce que j'ai commencer à faire mais ya des problèmes:
http://www.purebasic.fr/french/viewtopi ... =1&t=15487

Comment vous, vous procéderiez pour faire cette objet ?
Voici mon code:

Code : Tout sélectionner

Structure MyStringBuilder
  
  MyStringBuilderAllocateMemory.B
  *MyStringBuilderMemoryID
  MyStringBuilderSize.I
  MyStringBuilderRemaining.I
  MyStringBuilderPosition.I
  
EndStructure

Global MyStringBuilder.MyStringBuilder

Procedure.B IsStringBuilder()
  
  If MyStringBuilder\MyStringBuilderAllocateMemory = #True And MyStringBuilder\MyStringBuilderMemoryID <> 0
    ProcedureReturn  1
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.I InitialiseStringBuilder(Taille.I = 1000)
  
  If Taille.I <= 0
    Taille.I = 1
  EndIf
  
  If Not IsStringBuilder()
    
    MyStringBuilder\MyStringBuilderMemoryID = AllocateMemory(Taille.I)
    
    If MyStringBuilder\MyStringBuilderMemoryID <> 0
      
      MyStringBuilder\MyStringBuilderAllocateMemory = #True
      MyStringBuilder\MyStringBuilderRemaining = MemorySize(MyStringBuilder\MyStringBuilderMemoryID)
      MyStringBuilder\MyStringBuilderSize = MemorySize(MyStringBuilder\MyStringBuilderMemoryID)
      MyStringBuilder\MyStringBuilderPosition = 0
      
      ProcedureReturn MyStringBuilder\MyStringBuilderRemaining
      
    Else
      ProcedureReturn 0
      
    EndIf
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.B StringBuilderClearString(Taille.I = 1000)
  
  If Taille.I <= 0
    Taille.I = 1
  EndIf
  
  If IsStringBuilder()
    
    FreeMemory(MyStringBuilder\MyStringBuilderMemoryID)
    
    MyStringBuilder\MyStringBuilderAllocateMemory = #False
    MyStringBuilder\MyStringBuilderMemoryID = 0
    MyStringBuilder\MyStringBuilderSize = 0
    MyStringBuilder\MyStringBuilderRemaining = 0
    MyStringBuilder\MyStringBuilderPosition = 0
    
    If InitialiseStringBuilder(Taille.I)
      ProcedureReturn 1
      
    Else
      ProcedureReturn 0
      
    EndIf
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.I StringBuilderAddString(String.s)
  
  If IsStringBuilder()
    
    If Len(String.s) > MyStringBuilder\MyStringBuilderRemaining.I
      
      MyStringBuilder\MyStringBuilderMemoryID = ReAllocateMemory(MyStringBuilder\MyStringBuilderMemoryID, MemorySize(MyStringBuilder\MyStringBuilderMemoryID) + (Len(String.s) * 10))
      
      If MyStringBuilder\MyStringBuilderMemoryID <> 0
        
        MyStringBuilder\MyStringBuilderRemaining = MemorySize(MyStringBuilder\MyStringBuilderMemoryID) - MyStringBuilder\MyStringBuilderPosition
        MyStringBuilder\MyStringBuilderSize = MemorySize(MyStringBuilder\MyStringBuilderMemoryID)
        
        OctetsWrite = PokeS(MyStringBuilder\MyStringBuilderMemoryID + MyStringBuilder\MyStringBuilderPosition, String.s, -1, #PB_Ascii | #PB_String_NoZero)
        
        MyStringBuilder\MyStringBuilderRemaining - OctetsWrite
        MyStringBuilder\MyStringBuilderPosition + OctetsWrite
        
        ProcedureReturn OctetsWrite
        
      Else
        ProcedureReturn 0
        
      EndIf
      
    Else
      
      OctetsWrite = PokeS(MyStringBuilder\MyStringBuilderMemoryID + MyStringBuilder\MyStringBuilderPosition, String.s, -1, #PB_Ascii | #PB_String_NoZero)
      
      MyStringBuilder\MyStringBuilderRemaining - OctetsWrite
      MyStringBuilder\MyStringBuilderPosition + OctetsWrite
      
      ProcedureReturn OctetsWrite
      
    EndIf
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.S StringBuilderGetString()
  
  If IsStringBuilder()
    ProcedureReturn PeekS(MyStringBuilder\MyStringBuilderMemoryID)
    
  Else
    ProcedureReturn ""
    
  EndIf
  
EndProcedure

Procedure.I StringBuilderGetMemoryID()
  
  If IsStringBuilder()
    ProcedureReturn MyStringBuilder\MyStringBuilderMemoryID
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.I StringBuilderGetMemorySize()
  
  If IsStringBuilder()
    ProcedureReturn MyStringBuilder\MyStringBuilderSize
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.I StringBuilderGetMemoryRemaining()
  
  If IsStringBuilder()
    ProcedureReturn MyStringBuilder\MyStringBuilderRemaining
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Procedure.I StringBuilderGetMemoryPosition()
  
  If IsStringBuilder()
    ProcedureReturn MyStringBuilder\MyStringBuilderPosition
    
  Else
    ProcedureReturn 0
    
  EndIf
  
EndProcedure

Abc$ = "Abcdefghijklmnopqrstuvwxyz"

If InitialiseStringBuilder() And IsStringBuilder()
  
  MessageRequester("StringBuilder Initialisation...", "StringBuilder MemoryID = " + 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 100000
    
    MemoryID = StringBuilderGetMemoryID()
    MemorySize = StringBuilderGetMemorySize()
    MemoryRemaining = StringBuilderGetMemoryRemaining()
    MemoryPosition = StringBuilderGetMemoryPosition()
    OctetsWrite = StringBuilderAddString(Abc$)
    
  Next
  
  Time2 = ElapsedMilliseconds()
  
  MessageRequester("StringBuilder Résultat...", "StringBuilder MemoryID = " + 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 16:08
par Brayane
Ty est pas du tout là, mais tient tu as raison et je te le prouve:

Code : Tout sélectionner

For I = 1 To 100000
  A$ + "Abcdef"
Next
Combien de temps ça met ça chez toi à s’exécute juste pour savoir ?
Un truc du style, 10 Sec.

Tu pense pas que ya plus rapide ?
Test mon code plus haut et dis moi si c'est pas mieux :wink:

Re: StringBuilder

Publié : dim. 20/sept./2015 17:32
par nico
Brayanne,

Dans ton code, quand on fais un debug Resultat$ après le next, eh bien, on a n'importe quoi. !!!???

Re: StringBuilder

Publié : dim. 20/sept./2015 17:38
par Brayane
Nico, non pas n'importe quoi mais des informations:

Taille de la mémoire totale (Du StringBuilder)
Nombre d'Octets écris
Octets restants (De libre)

Code revue et amélioré.

Re: StringBuilder

Publié : dim. 20/sept./2015 17:48
par Micheao
Brayane a écrit :Ty est pas du tout là, mais tient tu as raison et je te le prouve:

Code : Tout sélectionner

For I = 1 To 100000
  A$ + "Abcdef"
Next
Combien de temps ça met ça chez toi à s’exécute juste pour savoir ?
Un truc du style, 10 Sec.

Tu pense pas que ya plus rapide ?
Test mon code plus haut et dis moi si c'est pas mieux :wink:

Brayane Si tu crois qu'il ya plus rapide Participe au concours Birthday PurePunch et montre nous un peu ce que tu sais faire .

Re: StringBuilder

Publié : dim. 20/sept./2015 17:57
par nico
Tu le fais exprès de pas comprendre, dans le précédent code, tu as écrit:

Code : Tout sélectionner

For I = 1 To 100000
  
  Resultat$ = StringBuilderAddString(Abc$)
  
  TailleMemoire$ = StringField(Resultat$, 1, ".")
  OctetsEcrit$ = StringField(Resultat$, 2, ".")
  MemoireRestante$ = StringField(Resultat$, 3, ".")
  
Next
Alors je fais ça, je rajoute un Debug Resultat$ afin de voir si effectivement la fonction donne le résultat attendu, soit:

Code : Tout sélectionner

For I = 1 To 100000
  
  Resultat$ = StringBuilderAddString(Abc$)
  
  TailleMemoire$ = StringField(Resultat$, 1, ".")
  OctetsEcrit$ = StringField(Resultat$, 2, ".")
  MemoireRestante$ = StringField(Resultat$, 3, ".")
  
Next

Debug Resultat$
Et le résultat me donne ça:

Code : Tout sélectionner

2600000.26.0
Au lieu de ça, j'imagine:

Code : Tout sélectionner

AbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyzAbcdefghijklmnopqrstuvwxyz... etc, etc

Re: StringBuilder

Publié : dim. 20/sept./2015 17:58
par Brayane
Micheao -> Tu sais, je ne suis pas très calé moi hein, j'me débrouille c'est tout :)
Nico, non c'est toi qui ne comprends pas désolé ^^

Mais le code a été mis à jours depuis :)

Re: StringBuilder

Publié : dim. 20/sept./2015 17:59
par nico
Tu ne répond pas, quel est le résultat attendu?.

Cela t'arrive t'il de tester tes propres codes?

Re: StringBuilder

Publié : dim. 20/sept./2015 18:05
par Brayane
Nico:
2600000.26.0
=
Taille de la mémoire totale (Du StringBuilder)
Nombre d'Octets écris
Octets restants (De libre)
Tu ne répond pas, quel est le résultat attendu?.

Cela t'arrive t'il de tester tes propres codes?
Nico t'es un peu agressif la mon cher, laisse moi le temps d'écrire XD :lol:
Le résulta qui était attendus, je te l'es dis !

Nico, nan je teste jamais mes code ça sert a rien :lol:
Évidement que je les test et je t'es répondus :)

La fonction renvoyais une chaîne de caractères avec:
Taille de la mémoire totale (Du StringBuilder)
Nombre d'Octets écris
Octets restants (De libre)
2600000.26.0
J'ai corrigé tous ça et j'ai changé des choses car cela ne me convenais pas :)

Re: StringBuilder

Publié : dim. 20/sept./2015 18:08
par nico
Ce code est celui de Micoute?

Re: StringBuilder

Publié : dim. 20/sept./2015 18:14
par nico
On dirait un code repris de Fenic, http://www.purebasic.fr/english/viewtop ... ng+Builder.

Si le code existe déjà et qu'en plus tu le reprends, ça sert a quoi tout ça, a part faire perdre du temps a tout le monde.

Re: StringBuilder

Publié : dim. 20/sept./2015 18:17
par Brayane
Nico, ce code n'est pas de Micoute mais de moi ;)
Tu ne me crois pas ?, tu lui demandera :)
De plus je n'est copier personne, ce code est 100% maison, pas de copie, même pas d'inspiration d'un autre code puisque je savais même pas :)
Tout est de moi ;)

Re: StringBuilder

Publié : dim. 20/sept./2015 18:26
par nico
Dans ce cas, bravo, certainement l'un des meilleurs codes qui soit. :)

Re: StringBuilder

Publié : dim. 20/sept./2015 18:29
par Brayane
Tu veux dire quoi par la nico, c'est ironique ou c'est un compliment ?
Le meilleurs code qui soit ?
J'en doute, je ne suis pas un pro bien loin de la et ce code peut largement être amélioré !
Si c'est un compliment merci bien :)

Re: StringBuilder

Publié : dim. 20/sept./2015 18:31
par nico
Ce n'est pas ironique, cela a l'air de fonctionner (je n'ai pas pousser les tests) et le résultat par rapport à ce que donne PureBasic est stupéfiant.