IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PureBasic Discussion :

PureBasic 6.40 alpha 1 est disponible, avec une surprise !


Sujet :

PureBasic

  1. #1
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 alpha 1 est disponible, avec une surprise !
    Hi everyone !

    That's it, we finally decided to rework the internal stringmanager from the ground up ! The stringmanager hasn't changed since the PureBasic
    creation almost 30 years ago, so it wasn't an easy decision to make because major modification for the compilers were needed and all the functions returning a string were impacted. But it's here with the 6.40 alpha 1, only available for the C back-end on Windows x64. The idea is to validate the new stringmanager to see if there is any showstopper before porting the modification to the x86 and x64 asm compilers which will takes time.

    I will share some internal information about it:

    - It should be 99% backward compatible. We will discuss edge case below.

    - All strings are now prefixed by their length (except the strings in DataSection). The last bit of this prefix is used for a temporary flag.
    That means than all string operation will have instant length information resulting in faster operation as iterating byte by byte on the string to find the null terminated char is no more needed.
    The strings are still null terminated, so no change are needed in client code.

    - Still no garbage collector

    - The string manager doesn't have a per thread shared buffer anymore for temporary strings. That means there is no global variable to save the current position and the thread mode will have no performance hit. All is now done as new temporary string which will be used as final string if assigned. That removes useless string copy and is much more streamlined.

    Example:

    Old:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SYS_PushStringBasePosition(); // current position in the shared buffer is saved (costly in threaded mode)
    SYS_CopyString(v_bS); // string is copied on the per thread shared buffer 
    SYS_CopyString(v_cS);
    SYS_AllocateString4(&v_aS,SYS_PopStringBasePosition()); // Position is restored and string is allocated

    New:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    s1=SYS_ConcatString(v_cS,v_bS); // A temporary string is created here
    SYS_NewString(&v_aS,s1); // The temporary string is directly used (temporary bit removed)

    It's a very basic case, but it shows the improvement by avoiding useless string copy and global variable preservation

    - Optimized procedure parameters passing. If a string parameter isn't modified in the procedure, it will not be duplicated in the procedure. For example

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Procedure.s a(a$, b$)
      ProcedureReturn UCase(a$) + LCase(b$)
    EndProcedure
    Here the a$ and b$ are just referenced and won't be duplicated. In the older system, all the string parameters were duplicated.

    Even better, the procedure 'a()' will return a temporary string which will be directly assigned to Result$ (no extra allocation/copy):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result$ = a("Hello", "World")
    Here are the case where the parameters will be duplicated

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure.s a(a$, b$)
      a$ = "-"+a$ ; Here, the a$ will be duplicated at procedure start, as it's modified.
      ProcedureReturn UCase(a$) + LCase(b$)
    EndProcedure
     
    Procedure.s a(a$, b$)
      *Cursor = @a$ ; Will also be duplicated as getting the pointer allow modification
      ProcedureReturn UCase(a$) + LCase(b$)
    EndProcedure
    - The string functions don't have an hidden parameter anymore, allowing better code generation

    c$ = Str(150)

    Old:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SYS_PushStringBasePosition();
    SYS_PushStringBasePosition();
    PB_Str(150LL,SYS_PopStringBasePosition());
    SYS_AllocateString4(&v_cS,SYS_PopStringBasePosition());
    New:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void *r5=PB_Str(150LL);
    SYS_NewString(&v_cS,r5);
    - For PureBasic function returning a string, it's possible to tag a parameter as 'reusable' to avoid extra allocation when a temporary string is passed. For now, only LCase() and UCase() uses this, but it greatly improves their performances:

    Ex:

    The allocation is done when concatenating 'b$' + 'c$', then the UCase() function directly change the buffer with upper case character and returns the same buffer which is assigned to a$. So only one allocation occurred and no extra copy were performed.

    - The 'mimalloc' memory manager has been integrated in PureBasic for all dynamic allocation to have a very fast and optimized memory allocator for all internal functions. More info here: https://github.com/microsoft/mimalloc

    - Overall the performances should be much better, but there will be probably some case were it won't ! Feel free to test it and bench it with your own code (my speed test suite show major improvement (up to 10x) on most tests). For example this one is 9x faster:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Start = ElapsedMilliseconds()
    a$ = "World WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld WorldWorld World"
    For l = 0 To 1000
      b$ = b$ + a$ 
    Next
     
    PrintN("Final length = " + Str(Len(b$)))
    PrintN("Large concat: "+Str(ElapsedMilliseconds() - Start) + " ms")
    - Edge cases:

    We tried to do the migration as painless as possible, but there is some case where code change will be required. Basically if you patch a string by putting a zero in it, the Len() function will be wrong, and the concat functions will fail. You will need to use PeekS() for this.
    You can take a look to the needed modification for the IDE to work with the new stringmanager, it's very light: https://github.com/fantaisie-software/p ... /344/files

    Using Win32 API with Space() for example will require an extra PeekS(). If you find other issues, don't hesitate to share it, so I can take a look if it can be addressed or not.

    We hope this major rework will increase the PureBasic app efficiency. Don't hesitate to test it but don't use this build in prod, it's indeed not production ready yet !

    Have fun,

    The Fantaisie Software Team

    Source de l'information
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  2. #2
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 alpha 3 est disponible sur votre compte
    Comme d'habitude, je ne traduis pas votre anglais est meilleur que le mien.
    2026-01-31: alpha 3 is available for Windows x64 ! A few more bugs has been fixed, and a new StringBuilder library has been added for very fast string concatenation ! Here is a small example:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    a$ = "Hello, World !"
    CreateStringBuilder(0, 64000)
    For l = 1 To 2000
      AppendStringBuilderString(0, a$)
    Next
    b$ = FinishStringBuilder(0)

    Don't hesitate to test this version if you can as we believe it's ready for larger tests.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  3. #3
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 alpha 4 est disponible sur votre compte
    2026-02-12: alpha 4 is out, the assembly x64 backend is back in business ! If you can, please test it to see if everything works as expected.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  4. #4
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 beta 1 est disponible sur votre compte
    2026-02-27: beta 1 is out, the assembly x86 backend is also fully working, on Windows and Linux ! All packages are now availables for testing, as usual.
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  5. #5
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 beta 2 est disponible sur votre compte
    2026-03-11: beta 2 is out ! Please test is as much as you can, we have ironed out some more bugs and should be better now. The procedure string parameter optimization has been disabled as it doesn't always work as expected.
    Source de l'information et liste des bugs corrigés
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  6. #6
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 beta 4 est disponible sur votre compte
    Avec un peu de retard, voici l'annonce de la beta 3
    2026-03-13: beta 3 is out, with a few fixes and mimalloc activated for Raspberry PI ! Don't hesitate to test with your own projects, so we can have a stable release.
    Et là c'est tout frais, ça vient de sortir, la beta 4 est dispo avec la doc en anglais (en attendant la traduction en français).
    2026-03-18: beta 4 is out, only one fix in it, we're getting there ! Please test with your own projects, so we can have a stable release. The doc for StringBuilder has been added (English) only.

    And another small string benchmark, focused on some string functions

    v6.40b4 (Threadsafe ON):

    Left(): 58 ms
    Right(): 51 ms
    Len(): 3 ms
    InsertString(): 113 ms
    RemoveString(): 466 ms
    ReplaceString(): 731 ms
    ReplaceString() no matches: 151 ms
    ReverseString(): 85 ms
    LTrim(): 11 ms
    RTrim(): 225 ms
    LSet(): 243 ms
    RSet(): 263 ms
    StringField(): 303 ms
    Mid(): 306 ms
    Finished

    v6.30 (Threadsafe ON):

    Left(): 1427 ms
    Right(): 1238 ms
    Len(): 1033 ms
    InsertString(): 308 ms
    RemoveString(): 579 ms
    ReplaceString(): 1041 ms
    ReplaceString() no matches: 448 ms
    ReverseString(): 240 ms
    LTrim(): 201 ms
    RTrim(): 518 ms
    LSet(): 761 ms
    RSet(): 891 ms
    StringField(): 941 ms
    Mid(): 1003 ms
    Finished
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    CompilerIf #PB_Compiler_Debugger
      CompilerError "Please disable the debugger"
    CompilerEndIf
     
    OpenConsole()
     
    big$ = "Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello HelloHello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello"
     
    Start = ElapsedMilliseconds()
    For l = 0 To 100000
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
      b$ = Left(big$, 15)
    Next
    PrintN("Left(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 100000
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
      b$ = Right(big$, 15)
    Next
    PrintN("Right(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 100000
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
      a = Len(big$)
    Next
    PrintN("Len(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 10000
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
      a$ = InsertString(big$, "Inserted !", 120)
    Next
    PrintN("InsertString(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 10000
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
      a$ = RemoveString(big$, "Hell")
    Next
    PrintN("RemoveString(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 10000
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
      a$ = ReplaceString(big$, "Hello", "Bye")
    Next
    PrintN("ReplaceString(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 10000
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
      a$ = ReplaceString(big$, "NotHere !", "Bye")
    Next
    PrintN("ReplaceString() no matches: "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 10000
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
      a$ = ReverseString(big$)
    Next
    PrintN("ReverseString(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    Start = ElapsedMilliseconds()
    For l = 0 To 10000
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
      a$ = LTrim(big$, "H")
    Next
    PrintN("LTrim(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    For l = 0 To 10000
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
      a$ = RTrim(big$, "o")
    Next
    PrintN("RTrim(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    For l = 0 To 10000
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
      a$ = LSet(big$, 1000, "x")
    Next
    PrintN("LSet(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    For l = 0 To 10000
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
      a$ = RSet(big$, 1000, "x")
    Next
    PrintN("RSet(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    For l = 0 To 10000
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
      a$ = StringField(big$, 50, " ")
    Next
    PrintN("StringField(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
     
    For l = 0 To 10000
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
      a$ = Mid(big$, 700, 1)
    Next
    PrintN("Mid(): "+Str(ElapsedMilliseconds() - Start) + " ms")
     
    PrintN("Finished")
    Input()
    Source de l'information
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  7. #7
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 beta 5 est disponible sur votre compte
    Dans l'annonce ci-dessous Fred parle de community PR, voici le lien https://www.purebasic.fr/english/viewtopic.php?t=88615


    2026-03-27: beta 5 is out, with updated doc (thanks Andre and Mesa !) and all the community PR ! Also all the requested API constants and structure have been added (https://www.purebasic.fr/english/viewtopic.php?t=64838). Don't hesitate to test as it could be the last beta before the final release !

    Community improvements
    Added: Sort arrays, lists, and maps in variableViewer https://github.com/fantaisie-software/p ... c/pull/342
    Added: Sort and Filter Project Files https://github.com/fantaisie-software/p ... c/pull/341
    Added: Detect elementaryOS file manager "Files" https://github.com/fantaisie-software/p ... c/pull/350
    Added: Support for explicit gadget IDs & explicit window IDs in the PureBasic Form Designer https://github.com/fantaisie-software/p ... c/pull/347

    Community fixes
    Fixed: IDE tab moving on new MacOS https://github.com/fantaisie-software/p ... c/pull/356
    Fixed: FontRequester() missing args so Style is passed in correctly https://github.com/fantaisie-software/p ... c/pull/352
    Fixed: The IDE is no longer closed when an open file is overwritten https://github.com/fantaisie-software/p ... c/pull/345
    Optimized: Less resize on splitters changes https://github.com/fantaisie-software/p ... c/pull/346
    Source de l'information et liste des bugs corrigés
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  8. #8
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 beta 6 est disponible sur votre compte
    2026-03-30: beta 6 is available, with some fixes and rework on the StringBuilder lib (english doc updated).

    Changed: FinishStringBuilder() to GetStringBuilderString().
    Added: AppendStringBuilderStringN().
    Source de l'information et liste des bugs corrigés
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

  9. #9
    Responsable Purebasic

    Avatar de comtois
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 334
    Billets dans le blog
    8
    Par défaut PureBasic 6.40 version finale est sorti.
    2026-04-10: Final version is out ! Thanks a lot to everyone for the tests and enjoy the increased speed for string related functions ! It's been a long time we didn't rework a very old core component and while the work was huge, the results are here .
    Télécharger une version démo
    Vous souhaitez participer à la rubrique PureBasic (tutoriels, FAQ, sources) ? Contactez-moi par MP.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/12/2019, 15h31
  2. LLVM 7 est disponible avec une nouvelle extension LLVM pour Visual Studio
    Par Christian Olivier dans le forum Clang et LLDB
    Réponses: 0
    Dernier message: 24/09/2018, 20h45
  3. GTK+ 3.20 est disponible avec une mise à jour de ses composants de base
    Par Victor Vincent dans le forum GTK+ avec C & C++
    Réponses: 0
    Dernier message: 27/03/2016, 12h02
  4. Firefox 43 est disponible avec une version 64 bits pour Windows
    Par Olivier Famien dans le forum Firefox
    Réponses: 11
    Dernier message: 22/12/2015, 08h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo