do big_string_bench with "x = s + '?'"Here is the result log (Pentium III/850, 256 MB RAM, NT5, VFP7). The first three tests were just for checking parameter passing (the positive result is that surrounding the string parameter with parens to force value passing does not incur a performance penalty when SET("UDFP") == "VALUE").
Visual FoxPro 07.00.0000.9297 for Windows * * 100 times: x = UDF(@s) * pass 1, string size 1048576 --> 0,000 seconds pass 2, string size 2097152 --> 0,010 seconds pass 3, string size 4194304 --> 0,000 seconds pass 4, string size 8388608 --> 0,010 seconds * * 100 times: x = UDF(s) * pass 1, string size 1048576 --> 1,762 seconds pass 2, string size 2097152 --> 4,417 seconds pass 3, string size 4194304 --> 9,313 seconds pass 4, string size 8388608 --> 19,078 seconds * * 100 times: x = UDF((s)) * pass 1, string size 1048576 --> 1,973 seconds pass 2, string size 2097152 --> 4,416 seconds pass 3, string size 4194304 --> 9,304 seconds pass 4, string size 8388608 --> 18,526 seconds * * 100 times: x = SUBSTR(s, 1 + <random>, 1) * pass 1, string size 1048576 --> 0,591 seconds pass 2, string size 2097152 --> 1,181 seconds pass 3, string size 4194304 --> 2,364 seconds pass 4, string size 8388608 --> 4,717 seconds * * 100 times: x = LEFT(s, 1) * pass 1, string size 1048576 --> 0,591 seconds pass 2, string size 2097152 --> 1,182 seconds pass 3, string size 4194304 --> 2,363 seconds pass 4, string size 8388608 --> 4,717 seconds * * 100 times: x = RIGHT(s, 1) * pass 1, string size 1048576 --> 0,591 seconds pass 2, string size 2097152 --> 1,181 seconds pass 3, string size 4194304 --> 2,364 seconds pass 4, string size 8388608 --> 4,716 seconds * * 100 times: x = LEN(s) * pass 1, string size 1048576 --> 0,751 seconds pass 2, string size 2097152 --> 2,003 seconds pass 3, string size 4194304 --> 4,486 seconds pass 4, string size 8388608 --> 8,893 seconds * * 100 times: x = EMPTY(s) * pass 1, string size 1048576 --> 0,771 seconds pass 2, string size 2097152 --> 2,033 seconds pass 3, string size 4194304 --> 4,536 seconds pass 4, string size 8388608 --> 9,444 seconds * * 100 times: x = ASC(s) * pass 1, string size 1048576 --> 0,761 seconds pass 2, string size 2097152 --> 2,013 seconds pass 3, string size 4194304 --> 4,486 seconds pass 4, string size 8388608 --> 9,444 seconds * * 100 times: x = iif(FSEEK(f, <random>) # 0 or .T., FREAD(f, 1), "") * * time includes writing the string to disk before the loop pass 1, string size 1048576 --> 0,051 seconds pass 2, string size 2097152 --> 0,110 seconds pass 3, string size 4194304 --> 0,211 seconds pass 4, string size 8388608 --> 0,932 seconds * * 100 times: x = iif(FSEEK(f, <random>) # 0 or .T., FREAD(f, 1), "") * pass 1, string size 1048576 --> 0,000 seconds pass 2, string size 2097152 --> 0,010 seconds pass 3, string size 4194304 --> 0,000 seconds pass 4, string size 8388608 --> 0,000 seconds