-------------------------------------------------------------------------------------- [ENHANCED] VFP 9.0 FIX - SYS(9072) ENABLES OR DISABLES FAST STRING FUNCTIONS January 2024 -------------------------------------------------------------------------------------- CCB 1. THE SYS(9072) FUNCTION: SYS(9072) - Enables or disables fast string functions Enables or disables fast string functions. SYS(9072 [, 0 | 1 | 2]) Parameters 0 Disables fast string functions. 0 is the startup default for Visual FoxPro Advanced. 1 Enables fast string functions if the functions are not called in SQL statements, and disables fast string functions if the functions are called in SQL statements. 2 Enables fast string functions. Return Value Character Remarks If we enable fast string functions in Visual FoxPro Advanced, it is the same as enabling the SYS(9900,9010-9073) functions, Visual FoxPro Advanced will be faster. There are some test results: LEN(): 10 MB LOOP COUNT: 10000 ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9010-9073) Functions | Optimized Parameters | Disable | Enable | Rate | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9010,0|1) - Enables or disables fast SUBSTR(), SUBSTRC() functions. | p1 | 32 | 0.02 | 1500 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9011,0|1) - Enables or disables fast LEFT(), LEFTC() functions. | p1 | 36 | 0.01 | 3600 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9012,0|1) - Enables or disables fast RIGHT(), RIGHTC() functions. | p1 | 32 | 0.02 | 1500 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9013,0|1) - Enables or disables fast UPPER() function. | p1 | 270 | 250 | 1.1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9014,0|1) - Enables or disables fast LOWER() function. | p1 | 270 | 250 | 1.1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9015,0|1) - Enables or disables fast PROPER() function. | p1 | 340 | 420 | 0.8 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9016,0|1) - Enables or disables fast LEN(), LENC() functions. | p1 | 63 | 0.01 | 6300 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9017,0|1) - Enables or disables fast EMPTY() function. | p1 | 52 | 0.01 | 5200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9018,0|1) - Enables or disables fast VARTYPE() function. | p1 | 52 | 0.01 | 5200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9019,0|1) - Enables or disables fast LTRIM() function. | p1 | 111 | 87 | 1.3 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9020,0|1) - Enables or disables fast RTRIM(), TRIM() functions. | p1 | 93 | 87 | 1.1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9021,0|1) - Enables or disables fast ALLTRIM() function. | p1 | 110 | 87 | 1.3 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9022,0|1) - Enables or disables fast PADL(), PADR(), PADC() functions. | p1 | 108 | 107 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9023,0|1) - Enables or disables fast STUFF(), STUFFC() functions. | p1 | 81 | 77 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9024,0|1|2) - Enables or disables fast CHRTRAN(), CHRTRANC() functions. | p1 | 554 | 492|492 | 1.1:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9025,0|1|2) - Enables or disables fast STRTRAN() function. | p1 | 51000|50000|1950 | 25:25:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9026,0|1|2) - Enables or disables fast AT(), AT_C(), ATC(), ATCC() functions. | p2 | 16 |0.02|0.02| 800:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9027,0|1|2) - Enables or disables fast RAT(), RATC() functions. | p2 | 20 |0.02|0.02| 1000:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9028,0|1|2) - Enables or disables fast ATLINE(), ATCLINE(), RATLINE() functions. | p2 | 19 |0.02|0.02| 950:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9029,0|1|2) - Enables or disables fast OCCURS() function. | p2 | 2100 |1900|1900| 1.1:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9030,0|1) - Enables or disables fast GETWORDCOUNT() function. | p1 | 4100 | 3900 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9031,0|1) - Enables or disables fast GETWORDNUM() function. | p1 | 27 | 0.01 | 2700 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9032,0|1) - Enables or disables fast TRANSFORM() function. | p1 | 21 | 0.03 | 700 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9033,0|1|2) - Enables or disables fast TEXTMERGE() function. | p1 | 167 | 147|147 | 1.1:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9034,0|1|2) - Enables or disables fast STREXTRACT() function. | p1 | 1800 |1800|1800| 1:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9035,0|1) - Enables or disables fast STRCONV() function. | p1 | 207 | 205 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9036,0|1) - Enables or disables fast STRTOFILE() function. | p1 | 117 | 67 | 1.7 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9037,0|1) - Enables or disables fast SYS(2007) function. | p1 | 877 | 866 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9038,0|1) - Enables or disables fast TYPE() function. | p1 | 16 | 0.01 | 1600 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9039,0|1) - Enables or disables fast FWRITE(), FPUTS() functions. | p2 | 62 | 19 | 3 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9040,0|1) - Enables or disables fast XMLTOCURSOR() function. | p1 | 47550 | 47220 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9041,0|1) - Enables or disables fast ALINES() function. | p2 | 38 | 36 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9042,0|1) - Enables or disables fast ISNULL() function. | p1 | 42 | 0.01 | 4200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9043,0|1) - Enables or disables fast ISBLANK() function. | p1 | 42 | 0.01 | 4200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9044,0|1) - Enables or disables fast ISALPHA() function. | p1 | 43 | 0.01 | 4300 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9045,0|1) - Enables or disables fast ISDIGIT() function. | p1 | 43 | 0.01 | 4300 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9046,0|1) - Enables or disables fast ISUPPER() function. | p1 | 43 | 0.01 | 4300 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9047,0|1) - Enables or disables fast ISLOWER() function. | p1 | 43 | 0.01 | 4300 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9048,0|1) - Enables or disables fast ISLEADBYTE() function. | p1 | 43 | 0.01 | 4300 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9049,0|1) - Enables or disables fast NVL() function. | p1 | 32 | 31 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9050,0|1) - Enables or disables fast EVL() function. | p1 | 34 | 32 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9051,0|1) - Enables or disables fast BETWEEN() function. | p1 | 42 | 0.01 | 4200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9052,0|1) - Enables or disables fast INLIST() function. | p1 | 42 | 0.01 | 4200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9053,0|1) - Enables or disables fast LIKE(), LIKEC() functions. | p2 | 42 | 0.01 | 4200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9054,0|1|2) - Enables or disables fast $ operator. | p1,p2 | 16 |0.01|0.01| 1600:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9055,0|1) - Enables or disables fast + operator. | p1,p2 | 53 | 35 | 1.5 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9056,0|1) - Enables or disables fast - operator. | p1,p2 | 50 | 34 | 1.5 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9057,0|1) - Enables or disables fast < operator. | p1,p2 | 42 | 0.01 | 4200 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9058,0|1) - Enables or disables fast <= operator. | p1,p2 | 39 | 0.01 | 3900 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9059,0|1) - Enables or disables fast != operator. | p1,p2 | 40 | 0.01 | 4000 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9060,0|1) - Enables or disables fast = operator. | p1,p2 | 44 | 0.01 | 4400 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9061,0|1) - Enables or disables fast > operator. | p1,p2 | 45 | 0.01 | 4500 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9062,0|1) - Enables or disables fast >= operator. | p1,p2 | 44 | 0.01 | 4400 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9063,0|1) - Enables or disables fast == operator. | p1,p2 | 16 | 0.01 | 1600 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9064,0|1) - Enables or disables fast REPLICATE() function. | p1 | 200 | 168 | 1.2 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9065,0|1) - Enables or disables fast += operator. | 0.00275 | 0.00139 | 2 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9066,0|1) - Enables or disables fast -= operator. | 0.00275 | 0.00139 | 2 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9067,0|1) - Enables or disables fast *= operator. | 0.00632 | 0.00632 | 1 : 1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9068,0|1) - Enables or disables fast /= operator. | --- | --- | --- | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9069,0|1) - Enables or disables fast %= operator. | --- | --- | --- | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (SUBSTR()). | 15 | 15|11 |1.3:1.3:1 | | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (LEFT()). | 15 | 15|11 |1.3:1.3:1 | | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (RIGHT()). | 15 | 15|11 |1.3:1.3:1 | | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (LEN()). | 40 | 40|32 |1.3:1.3:1 | | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (STRTRAN()). | 48000|48000|48000 | 1:1:1 | | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (STREXTRACT()). | 1850 |1850|1850| 1:1:1 | | SYS(9900,9070,0|1|2) - Enables or disables fast memcpy(), memmove() functions (XMLTOCURSOR()). | 15500|15100|15100 | 1:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9071,0|1|2) - Enables or disables fast strchr(), strchri() functions (CHRTRAN()). | 583 | 555|550 | 1:1:1 | | SYS(9900,9071,0|1|2) - Enables or disables fast strchr(), strchri() functions (GETWORDCOUNT()). | 2560 | 660|690 | 3.7:1:1 | | SYS(9900,9071,0|1|2) - Enables or disables fast strchr(), strchri() functions (GETWORDNUM()). | 19 | 19|19 | 1:1:1 | | SYS(9900,9071,0|1|2) - Enables or disables fast strchr(), strchri() functions (TEXTMERGE()). | 137 | 94|83 | 1.6:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9072,0|1|2) - Enables or disables fast strstr(), strstri() functions (STRTRAN()). | 51200|50000|50000 | 1:1:1 | | SYS(9900,9072,0|1|2) - Enables or disables fast strstr(), strstri() functions (ATLINE()). | 19 | 19|19 | 1:1:1 | | SYS(9900,9072,0|1|2) - Enables or disables fast strstr(), strstri() functions (OCCURS()). | 1900 | 160|160 | 12:1:1 | | SYS(9900,9072,0|1|2) - Enables or disables fast strstr(), strstri() functions (STREXTRACT()). | 1850 | 65|65 | 28:1:1 | ------------------------------------------------------------------------------------------------------------------------------------- | SYS(9900,9073,0|1|2) - Enables or disables fast strlen() function. | --- | --- | --- | ------------------------------------------------------------------------------------------------------------------------------------- 2. CAUSE: There are some BUGs in the following code. 3. RESOLUTION: We can write some code to fix the BUG. Fun529fca :: ; proc near push ebp ;0x00529fca : 55 mov ebp , esp ;0x00529fcb : 8bec pushd 0FFFFFFFFh ;0x00529fcd : 6aff pushd offset Data922268 ;0x00529fcf : 6868229200 pushd offset Label9160f9 ;0x00529fd4 : 68f9609100 mov eax , dword ptr fs:[00h] ;0x00529fd9 : 64a100000000 push eax ;0x00529fdf : 50 mov dword ptr fs:[00h] , esp ;0x00529fe0 : 64892500000000 push ecx ;0x00529fe7 : 51 push ecx ;0x00529fe8 : 51 mov eax , 02FBCh ;0x00529fe9 : b8bc2f0000 call Fun42c118 ;0x00529fee : e82521f0ff mov eax , dword ptr [ Data937090 ] ;0x00529ff3 : a190729300 mov dword ptr [ ebp - 28 ] , eax ;0x00529ff8 : 8945e4 push ebx ;0x00529ffb : 53 push esi ;0x00529ffc : 56 push edi ;0x00529ffd : 57 mov dword ptr [ ebp - 24 ] , esp ;0x00529ffe : 8965e8 xor edi , edi ;0x0052a001 : 33ff mov dword ptr [ ebp + 0FFFFD114h ] , edi ;0x0052a003 : 89bd14d1ffff push edi ;0x0052a009 : 57 pushd 02710h ;0x0052a00a : 6810270000 push edi ;0x0052a00f : 57 mov ebx , dword ptr [ ebp + 8 ] ;0x0052a010 : 8b5d08 mov eax , ebx ;0x0052a013 : 8bc3 call Fun529bc5 ;0x0052a015 : e8abfbffff mov dword ptr [ ebp + 0FFFFD0E4h ] , eax ;0x0052a01a : 8985e4d0ffff mov dword ptr [ ebp + 0FFFFD10Ch ] , edi ;0x0052a020 : 89bd0cd1ffff lea ecx , dword ptr [ ebp + 0FFFFFDE0h ] ;0x0052a026 : 8d8de0fdffff mov dword ptr [ ebp + 0FFFFD100h ] , ecx ;0x0052a02c : 898d00d1ffff mov byte ptr [ ebp + 0FFFFFDE0h ] , 00h ;0x0052a032 : c685e0fdffff00 movsx eax , ax ;0x0052a039 : 0fbfc0 ; ; --------------------------------------------------------------------------- ; VFP 9.0 FIX - SYS(9072) ENABLES OR DISABLES FAST STRING FUNCTIONS ; December 2021 ; --------------------------------------------------------------------------- ; CCB ; ; SYS(9072) - Enables or disables fast string functions. ; ; 2021/12/8, by ccb ; cmp eax,9072 je vfpa_sys9072_start pushd 064h ;0x0052a03c : 6a64 pop esi ;0x0052a03e : 5e cmp eax , esi ;0x0052a03f : 3bc6 jle Label52a0d0 ;0x0052a041 : 0f8e89067000 mov ecx , 07EAh ;0x0052a047 : b9ea070000 cmp eax , ecx ;0x0052a04c : 3bc1 jg Label52a164 ;0x0052a04e : 0f8f10010000 je Label609b33 ;0x0052a054 : 0f84d9fa0d00 mov ecx , 04F6h ;0x0052a05a : b9f6040000 cmp eax , ecx ;0x0052a05f : 3bc1 jle Label52b6e0 ;0x0052a061 : 0f8e79160000 mov ecx , 07DBh ;0x0052a067 : b9db070000 cmp eax , ecx ;0x0052a06c : 3bc1 jg Label51f355 ;0x0052a06e : 0f8fe152ffff je Label609700 ;0x0052a074 : 0f8486f60d00 add ecx , 0FFFFFFF9h ;0x0052a07a : 83c1f9 cmp eax , ecx ;0x0052a07d : 3bc1 jg Label4a4938 ;0x0052a07f : 0f8fb3a8f7ff je Label4f6b07 ;0x0052a085 : 0f847ccafcff sub eax , 04F7h ;0x0052a08b : 2df7040000 je Label60951e ;0x0052a090 : 0f8488f40d00 dec eax ;0x0052a096 : 48 je Label60950f ;0x0052a097 : 0f8472f40d00 sub eax , 0E4h ;0x0052a09d : 2de4000000 je Label609492 ;0x0052a0a2 : 0f84eaf30d00 sub eax , 01F4h ;0x0052a0a8 : 2df4010000 jne Label462026 ;0x0052a0ad : 0f85737ff3ff lea eax , dword ptr [ ebp + 0FFFFFDE0h ] ;0x0052a0b3 : 8d85e0fdffff push eax ;0x0052a0b9 : 50 push dword ptr [ ebp + 12 ] ;0x0052a0ba : ff750c mov edx , ebx ;0x0052a0bd : 8bd3 call Fun4dc923 ;0x0052a0bf : e85f28fbff 4. APPLIES TO: VFP 10 (VFP Advanced) 5. REFERENCE WEBSITES: 1, baiyujia.com: http://www.baiyujia.com http://www.baiyujia.com/vfpdocuments/f_vfp9fix95.asp http://www.baiyujia.com/vfpdocuments/f_vfp9fix96.asp http://www.baiyujia.com/vfpdocuments/f_vfp9fix199.asp http://www.baiyujia.com/vfpdocuments/f_vfp9fix233.asp 2, west-wind.com: https://west-wind.com/wconnect/weblog/ShowEntry.blog?id=962 https://west-wind.com/wconnect/weblog/ShowEntry.blog?id=882 3, stevenblack.com: http://stevenblack.com/articles/text-and-string-handling-in-VFP/ 4, agner.org: https://www.agner.org/optimize/ 6. OTHER: For reference only, there is no guarantees. Any questions or suggestions, please send me an email at ccb2000@163.com. |