Regex sure is fast

Btw, what Focus replied at first is also true.
Allocating an array item 50000 times versus allocating 50000 array items in one time is a huge difference.

Code:
Use Windows

Procedure Test
    DWord dwBegin dwEnd
    Integer i
    String[] words

    Move (GetTickCount()) to dwBegin
    Move (ResizeArray(words,50000)) to words
    Move (GetTickCount()) to dwEnd
    Showln "50k at 1x " (dwEnd - dwBegin) // I got 0

    Move (GetTickCount()) to dwBegin
    For i from 0 to 50000
        Move (ResizeArray(words,i)) to Words
    Loop
    Move (GetTickCount()) to dwEnd
    Showln "One item 50k x " (dwEnd - dwBegin) // I got 6203 for 64 bit DF20.0
    InKey FieldIndex
End_Procedure

Send Test
AFAICT it doesn't apply to StrSplitToArray as you can't pass a pre-initialised array, but the difference is certainly there.

Oh well. easy enough to test that too.

Code:
Use Windows

Procedure Test
    DWord dwBegin dwEnd
    String s
    String[] words
#IF !@<201
    Set_Argument_Size  1000000
#ENDIF
    Move (GetTickCount()) to dwBegin
    Move (Repeat("hello;", 50000)) to s
    Move (GetTickCount()) to dwEnd
    Showln "Combining " (dwEnd - dwBegin) // I got 0
    Move (GetTickCount()) to dwBegin
    Move (StrSplitToArray(s, ";")) to words
    Move (GetTickCount()) to dwEnd
    Showln "Splitting " (dwEnd - dwBegin) // I got 28859 for 64 bit.
    Move (ResizeArray(words,0)) to words
    Move (ResizeArray(words,50000)) to words
    Move (GetTickCount()) to dwBegin
    Move (StrSplitToArray(s, ";")) to words
    Move (GetTickCount()) to dwEnd
    Showln "Splitting preallocated " (dwEnd - dwBegin) // I got 32688 for 64 bit.
    InKey FieldIndex
End_Procedure

Send Test
About 4 seconds slower ... umm... Ok.
--
Wil