PureBasic

Forums PureBasic
Nous sommes le Mar 19/Jan/2021 10:54

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page Précédente  1, 2, 3  Suivante
Auteur Message
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 18:45 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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:
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 19:06 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
Autre petit exemple:
Code:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 22:30 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 309
Localisation: Alger
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:
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 22:38 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 12/Sep/2015 14:31
Messages: 309
Localisation: Alger
et son aucun des deux methode la joor comme ca
Code:
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 23:22 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
@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.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Dim 20/Sep/2015 23:49 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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:
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:
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 édition par Brayane le Lun 21/Sep/2015 0:16, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 0:15 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
Nico, ya rien de Ouf là dans je pense, c'est simplement que:

Citation:
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 0:24 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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 :)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 8:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 27/Oct/2006 12:19
Messages: 1253
Localisation: Calvados (14)
Code:
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 8:55 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6733
Localisation: Isere
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 9:23 
Hors ligne

Inscription: Dim 07/Déc/2014 10:12
Messages: 533
Localisation: Sud-Est
et il sert à quoi ce code


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 9:44 
Hors ligne

Inscription: Dim 07/Déc/2014 10:12
Messages: 533
Localisation: Sud-Est
Merci pour l'explication Spock mais quel intérêt de faire ce code à part que si on a un projet d'application


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 9:58 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3495
Code:
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")



Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 10:00 
Hors ligne

Inscription: Jeu 27/Aoû/2015 14:08
Messages: 54
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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: StringBuilder
MessagePosté: Lun 21/Sep/2015 10:13 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6733
Localisation: Isere
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


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 35 messages ]  Aller à la page Précédente  1, 2, 3  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 39 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye