The Non-Recursive-Engine, by Miguel Sofer, is a component of Tcl 8.6 and above which provides a mechanism for stackless evaluation of Tcl scripts.
Miguel Sofer began work on the NRE in 2008. It was announced via the TCLCORE mailing list message "Announce: Experimental NRE (non-recursive engine) ", 2008-03-02.
NRE's first implementation can be found in the mod-core-8-3-4 branch of the Tcl Core repository.
NRE was included in the 8.6a2 release.
Tclkits (i.e. single-file executables) containing Tcl 8.6a1 and NRE are archived at:
Development versions of NRE included the commands ::tcl::unsupported::tailcall and atProcExit, with examples in tests/unsupported.test''.
NRE started as an experiment in fixing the failure of the Tcl stack-3.1 test. Source: DKF, Tcl Chatroom, 2014-09-09
NRE was created to reduce usage of the C stack by Tcl when evaluating procedures, which made deep recursion problematic. NRE reduces the C stack consumption very noticeably, essentially making the recursion limit infinite (recursion depth is bounded by the heap not the stack). It also implements true tailcalls, making the recursion depth bound by things like the supply of electricity and/or the lifetime of the hardware.
Showing off - on a 256kB stack (128kB crashes on startup):
mig@uh:/home/CVS/fossil/tcl/unix$ ulimit -s 256 mig@uh:/home/CVS/fossil/tcl/unix$ ulimit -S 256 mig@uh:/home/CVS/fossil/tcl/unix$ ./tclsh % proc a i {if {[incr i] > 50000} {return $i}; a $i} % a 0 too many nested evaluations (infinite loop?) % interp recursionlimit {} 10000000 10000000 % a 0 50001
In the following report, version 8.6.0 features NRE:
000 VERSIONS: 1:8.6.0 2:8.5.7 3:8.4.19 001 ARRAY format genKeys 50 69.60 97.51 47.78 002 ARRAY format genKeys 500 773.45 1521.31 489.86 003 ARRAY makeHash 500 50 33074.56 49475.31 20046.36 004 ascii85 strlen 2690 2489.90 3033.66 3023.10 005 ascii85 strlen 269000 260930.8 528909.4 279435.7 006 BASE64 decode 10 33.73 66.80 42.87 007 BASE64 decode 100 259.03 277.59 367.79 008 BASE64 decode 1000 3710.93 2718.70 4565.41 009 BASE64 decode 10000 33488.20 26425.52 40416.10 010 BASE64 decode2 10 29.33 79.52 38.32 011 BASE64 decode2 100 254.18 315.14 341.20 012 BASE64 decode2 1000 3325.54 2652.13 3512.48 013 BASE64 decode2 10000 26273.45 24554.86 35751.30 014 BASE64 decode3 10 22.43 29.28 25.36 015 BASE64 decode3 100 129.52 147.36 156.78 016 BASE64 decode3 1000 1711.25 1514.78 1487.79 017 BASE64 decode3 10000 13734.26 20367.06 17936.80 018 BASE64 encode 10 23.70 39.57 29.23 019 BASE64 encode 100 157.88 218.69 209.30 020 BASE64 encode 1000 1820.57 2764.16 2438.73 021 BASE64 encode 10000 18397.27 21089.76 20889.70 022 BASE64 encode2 10 24.94 35.64 23.43 023 BASE64 encode2 100 166.55 145.98 219.95 024 BASE64 encode2 1000 1401.06 1821.84 1988.63 025 BASE64 encode2 10000 13027.94 14227.55 22047.50 026 BASE64 encode3 10 14.33 28.15 15.05 027 BASE64 encode3 100 74.17 71.34 115.75 028 BASE64 encode3 1000 1346.17 597.73 889.84 029 BASE64 encode3 10000 4936.69 5890.60 8265.54 030 BIN bitset-v1 1000 chars 2321.96 1232.95 1549.13 031 BIN bitset-v1 5000 chars 11664.10 5850.85 8150.95 032 BIN bitset-v1 10000 chars 22423.03 13292.54 15154.27 033 BIN bitset-v2 1000 chars 1384.77 768.46 865.74 034 BIN bitset-v2 5000 chars 6224.50 4308.98 3785.93 035 BIN bitset-v2 10000 chars 13232.74 8230.62 9572.55 036 BIN bitset-v3 1000 chars 477.19 418.38 407.31 037 BIN bitset-v3 5000 chars 2166.51 1422.15 1403.59 038 BIN bitset-v3 10000 chars 5843.05 3095.32 2976.93 039 BIN c scan, 1000b 97.66 90.29 107.36 040 BIN c scan, 5000b 317.60 339.17 405.12 041 BIN c scan, 10000b 577.90 733.22 644.74 042 BIN chars, 10000b 4610.57 3292.15 2862.88 043 BIN rand string 100b 194.83 125.61 100.80 044 BIN rand string 5000b 11211.29 6154.74 5080.53 045 BIN rand2 string 100b 93.64 66.58 45.08 046 BIN rand2 string 5000b 4156.36 3413.26 2014.34 047 BIN u char, 10000b 848.64 663.60 -=- 048 CATCH error, complex 5.29 8.33 3.28 049 CATCH no catch used 1.59 2.87 1.76 050 CATCH return error 7.94 7.11 3.42 051 CATCH return except 2.00 2.76 1.77 052 CATCH return ok 2.35 2.30 1.44 053 DATA access in a list 75.28 85.30 93.16 054 DATA access in an array 126.80 244.40 149.09 055 DATA create in a list 110.36 80.89 91.66 056 DATA create in an array 240.08 362.98 267.45 057 ENC iso2022-jp, gets 2737.27 2885.75 5476.90 058 ENC iso2022-jp, read 2983.01 3375.11 5992.63 059 ENC iso2022-jp, read & size 2614.15 3626.14 7255.57 060 ENC iso8859-2, gets 33.50 128.30 546.65 061 ENC iso8859-2, read 27.04 113.78 541.84 062 ENC iso8859-2, read & size 30.15 139.49 539.18 063 EVAL cmd and mixed lists 440.23 310.36 467.52 064 EVAL cmd eval as list 1.66 1.37 1.40 065 EVAL cmd eval as string 4.08 4.24 3.87 066 EVAL cmd eval in list obj var 2.59 2.53 1.91 067 EVAL cmd eval in list obj {*} 1.80 1.79 8.5+ 068 EVAL list cmd and mixed lists 449.02 379.01 530.42 069 EVAL list cmd and pure lists 13.96 17.82 13.82 070 EXPR $a != $b dbl 0.78 1.62 1.04 071 EXPR $a != $b int 0.62 2.05 1.44 072 EXPR $a != $b str (!= len) 1.15 2.91 1.81 073 EXPR $a != $b str (== len) 1.33 1.69 2.20 074 EXPR $a == $b dbl 0.67 2.13 1.18 075 EXPR $a == $b int 0.67 2.31 0.92 076 EXPR $a == $b str (!= len) 1.23 1.54 2.00 077 EXPR $a == $b str (== len) 1.61 1.57 2.57 078 EXPR abs as expr 0.68 1.80 1.05 079 EXPR abs builtin 1.15 1.34 1.00 080 EXPR braced 2.70 2.19 1.69 081 EXPR builtin dyn 8.33 7.40 5.78 082 EXPR builtin sin 1.11 0.92 0.90 083 EXPR cast double 1.18 1.25 1.20 084 EXPR cast int 1.29 1.44 0.72 085 EXPR fifty operands 2.60 3.86 2.19 086 EXPR incr with expr 0.59 0.52 0.64 087 EXPR incr with incr 0.47 0.55 0.70 088 EXPR inline 3.08 2.10 2.00 089 EXPR one operand 0.50 0.95 0.86 090 EXPR rand range 1.79 1.34 0.86 091 EXPR rand range func 2.49 1.86 1.58 092 EXPR ten operands 0.91 1.26 0.87 093 EXPR unbraced 16.46 18.56 15.04 094 EXPR unbraced long 42.72 40.34 65.75 095 EXPR UpdStrOfDbl+1.23 prec0 1.63 6.04 -=- 096 EXPR UpdStrOfDbl+1.23 prec12 1.25 2.60 1.79 097 EXPR UpdStrOfDbl+1.23 prec17 1.68 3.80 3.18 098 EXPR UpdStrOfDbl+1e-4 prec0 1.92 4.47 -=- 099 EXPR UpdStrOfDbl+1e-4 prec12 1.30 2.14 1.86 100 EXPR UpdStrOfDbl+1e-4 prec17 1.97 3.13 2.62 101 EXPR UpdStrOfDbl+1e27 prec0 4.08 4.23 -=- 102 EXPR UpdStrOfDbl+1e27 prec12 1.81 1.93 1.62 103 EXPR UpdStrOfDbl+1e27 prec17 7.11 3.35 2.79 104 FCOPY binary: 160K 7650.17 3701.10 3795.32 105 FCOPY encoding: 160K 7347.58 5603.14 6151.07 106 FCOPY std: 160K 4002.00 3742.82 3940.93 107 FILE exec interp 16963.16 10986.67 9948.67 108 FILE exec interp: pkg require 71852.66 72563.63 102763.8 109 FILE exists tmpfile (obj) 3.83 3.20 3.43 110 FILE exists ~ 3.45 4.02 2.99 111 FILE exists! tmpfile (obj) 3.01 4.05 3.51 112 FILE exists! tmpfile (str) 17.00 19.91 26.44 113 FILE glob tmpdir (60 entries) 79.97 128.35 116.35 114 FILE glob / all subcommands 7126.35 7040.26 5569.30 115 FILE glob / atime 1047.95 1502.17 1282.47 116 FILE glob / attributes 3358.57 3943.80 1975.15 117 FILE glob / dirname 128.20 178.66 279.58 118 FILE glob / executable 1487.16 1093.65 1187.75 119 FILE glob / exists 1204.73 1369.25 1216.79 120 FILE glob / extension 166.83 134.40 172.99 121 FILE glob / isdirectory 1096.24 1483.37 1216.40 122 FILE glob / isfile 1054.33 1234.92 1190.28 123 FILE glob / mtime 1014.72 1108.02 1411.60 124 FILE glob / owned 1178.54 1177.63 1330.03 125 FILE glob / readable 948.41 1184.79 1356.54 126 FILE glob / rootname 171.90 141.54 189.37 127 FILE glob / size 1382.07 1269.78 1215.26 128 FILE glob / tail 141.63 130.32 234.88 129 FILE glob / writable 1001.74 1179.97 1114.93 130 FILE recurse / -dir 4193.59 4604.86 5351.24 131 FILE recurse / cd 6515.83 7175.16 9499.38 132 FORMAT gen 1.61 1.99 1.64 133 GCCont_cpb::cGCC 50 49.62 34.14 26.76 134 GCCont_cpb::cGCC 500 256.43 205.15 173.90 135 GCCont_cpb::cGCC 5000 2492.35 2304.74 1420.11 136 GCCont_cpbre1::cGCC 50 50.01 47.42 49.93 137 GCCont_cpbre1::cGCC 500 296.21 304.43 444.83 138 GCCont_cpbre1::cGCC 5000 2561.55 3091.61 3577.26 139 GCCont_cpbre2::cGCC 50 37.88 40.34 47.25 140 GCCont_cpbre2::cGCC 500 310.72 353.33 344.52 141 GCCont_cpbre2::cGCC 5000 3025.56 3210.61 3372.26 142 GCCont_cpbrs2::cGCC 50 13.18 11.86 12.43 143 GCCont_cpbrs2::cGCC 500 36.01 48.70 64.17 144 GCCont_cpbrs2::cGCC 5000 280.55 361.94 409.66 145 GCCont_cpbrs::cGCC1 50 15.86 18.65 22.43 146 GCCont_cpbrs::cGCC1 500 46.87 57.12 97.95 147 GCCont_cpbrs::cGCC1 5000 264.12 412.04 581.50 148 GCCont_cpbrs::cGCC2 50 12.37 16.57 20.79 149 GCCont_cpbrs::cGCC2 500 40.06 49.85 82.35 150 GCCont_cpbrs::cGCC2 5000 246.46 323.87 430.56 151 GCCont_cpbrs_trap::cGCC 50 39.03 45.41 57.45 152 GCCont_cpbrs_trap::cGCC 500 320.01 362.43 401.53 153 GCCont_cpbrs_trap::cGCC 5000 2386.89 3286.44 3278.82 154 GCCont_expr::cGCC 50 25.08 31.61 28.37 155 GCCont_expr::cGCC 500 100.57 112.89 209.42 156 GCCont_expr::cGCC 5000 1163.38 1067.38 11194.76 157 GCCont_i::cGCC1 50 22.31 34.87 49.38 158 GCCont_i::cGCC1 500 171.86 221.53 504.28 159 GCCont_i::cGCC1 5000 1985.21 2772.24 4411.34 160 GCCont_i::cGCC2 50 23.46 27.37 15.80 161 GCCont_i::cGCC2 500 174.70 189.13 159.58 162 GCCont_i::cGCC2 5000 2063.47 2138.57 1265.04 163 GCCont_i::cGCC3 50 18.55 20.15 13.74 164 GCCont_i::cGCC3 500 138.23 160.87 110.85 165 GCCont_i::cGCC3 5000 1688.25 1623.13 1108.54 166 GCCont_r1::cGCC 50 37.93 33.48 70.07 167 GCCont_r1::cGCC 500 317.21 277.53 585.65 168 GCCont_r1::cGCC 5000 2455.35 2899.43 6145.00 169 GCCont_r2::cGCC 50 25.59 41.38 59.47 170 GCCont_r2::cGCC 500 251.98 259.13 470.93 171 GCCont_r2::cGCC 5000 2060.66 2292.97 5348.78 172 GCCont_r3::cGCC 50 25.29 33.68 69.65 173 GCCont_r3::cGCC 500 262.16 266.42 492.91 174 GCCont_r3::cGCC 5000 2682.22 2900.10 5554.98 175 GCCont_rsf1::cGCC 50 20.57 22.61 23.31 176 GCCont_rsf1::cGCC 500 129.17 202.92 141.75 177 GCCont_rsf1::cGCC 5000 1429.25 1646.95 1517.61 178 GCCont_rsf2::cGCC1 50 14.89 17.48 18.89 179 GCCont_rsf2::cGCC1 500 73.78 123.42 83.67 180 GCCont_rsf2::cGCC1 5000 692.22 692.80 789.69 181 GCCont_rsf2::cGCC2 50 13.25 13.32 14.75 182 GCCont_rsf2::cGCC2 500 84.52 100.30 89.61 183 GCCont_rsf2::cGCC2 5000 791.83 618.88 704.18 184 GCCont_rsf3::cGCC 50 16.63 16.58 12.95 185 GCCont_rsf3::cGCC 500 76.98 78.46 78.27 186 GCCont_rsf3::cGCC 5000 759.93 646.93 586.45 187 GCCont_turing::cGCC 50 8.98 15.16 11.91 188 GCCont_turing::cGCC 500 46.87 56.96 65.37 189 GCCont_turing::cGCC 5000 313.24 529.32 569.64 190 HEAPSORT size 10 26.84 53.27 36.97 191 HEAPSORT size 50 269.57 472.24 406.45 192 HEAPSORT size 100 743.76 1107.40 939.59 193 HEAPSORT2 size 10 25.34 35.45 38.13 194 HEAPSORT2 size 50 307.25 374.75 406.37 195 HEAPSORT2 size 100 715.40 650.67 1014.39 196 IF 1/0 check 0.97 0.68 0.82 197 IF else true al 1.38 1.91 1.93 198 IF else true numeric 0.83 1.38 0.90 199 IF elseif true al 1.22 1.86 2.47 200 IF elseif true numeric 0.97 1.41 0.86 201 IF if false al/al 1.33 2.19 1.26 202 IF if false al/num 0.98 1.42 1.03 203 IF if false num/num 0.80 1.38 0.80 204 IF if true al 0.84 1.30 1.26 205 IF if true al/al 1.12 1.22 1.02 206 IF if true num/num 0.99 1.21 0.85 207 IF if true numeric 0.94 1.23 0.92 208 IF multi 1st true 0.92 0.97 0.93 209 IF multi 2nd true 0.70 1.35 2.86 210 IF multi 9th true 1.55 2.10 1.68 211 IF multi default true 1.45 2.14 2.46 212 KLIST shuffle0 llength 1 4.88 4.75 5.40 213 KLIST shuffle0 llength 10 15.45 17.72 15.30 214 KLIST shuffle0 llength 100 132.61 115.46 156.62 215 KLIST shuffle0 llength 1000 1360.54 1287.52 1655.30 216 KLIST shuffle0 llength 10000 19875.74 18234.04 26629.50 217 KLIST shuffle1-s llength 1 3.44 3.80 7.75 218 KLIST shuffle1-s llength 10 20.27 29.84 29.57 219 KLIST shuffle1-s llength 100 359.97 407.01 291.92 220 KLIST shuffle1-s llength 1000 16027.01 16313.25 12891.61 221 KLIST shuffle1a llength 1 4.82 5.08 5.22 222 KLIST shuffle1a llength 10 31.80 35.96 32.12 223 KLIST shuffle1a llength 100 392.22 271.15 298.79 224 KLIST shuffle1a llength 1000 3667.02 2636.58 3396.77 225 KLIST shuffle1a llength 10000 31776.75 33972.63 33295.30 226 KLIST shuffle2 llength 1 3.64 4.06 4.48 227 KLIST shuffle2 llength 10 34.69 35.74 22.94 228 KLIST shuffle2 llength 100 203.32 286.23 239.97 229 KLIST shuffle2 llength 1000 2525.92 3649.89 2725.95 230 KLIST shuffle2 llength 10000 31013.22 51274.55 27492.60 231 KLIST shuffle3 llength 1 4.93 3.92 6.34 232 KLIST shuffle3 llength 10 40.75 21.56 21.79 233 KLIST shuffle3 llength 100 231.08 223.22 196.31 234 KLIST shuffle3 llength 1000 2295.88 1961.60 2353.92 235 KLIST shuffle3 llength 10000 56341.29 51503.83 30541.50 236 KLIST shuffle4 llength 1 5.79 3.56 4.42 237 KLIST shuffle4 llength 10 23.12 21.20 23.15 238 KLIST shuffle4 llength 100 210.15 197.92 217.66 239 KLIST shuffle4 llength 1000 2231.96 2614.74 2161.06 240 KLIST shuffle4 llength 10000 24829.51 22164.91 21152.50 241 KLIST shuffle5-s llength 1 3.68 2.38 3.74 242 KLIST shuffle5-s llength 10 17.92 15.59 13.54 243 KLIST shuffle5-s llength 100 184.49 168.16 158.76 244 KLIST shuffle5-s llength 1000 5414.01 4654.49 4939.31 245 KLIST shuffle5a llength 1 3.59 2.89 3.47 246 KLIST shuffle5a llength 10 25.87 30.69 27.22 247 KLIST shuffle5a llength 100 224.01 219.94 179.48 248 KLIST shuffle5a llength 1000 2432.85 2557.92 2258.25 249 KLIST shuffle5a llength 10000 50017.27 59075.28 35354.70 250 KLIST shuffle6 llength 1 1.27 1.08 0.91 251 KLIST shuffle6 llength 10 11.19 14.82 11.73 252 KLIST shuffle6 llength 100 102.85 131.48 84.94 253 KLIST shuffle6 llength 1000 952.86 1192.63 1052.95 254 KLIST shuffle6 llength 10000 12003.74 9641.82 10786.20 255 LIST append to list 0.79 0.90 1.16 256 LIST concat APPEND 2x10 5.07 4.72 5.62 257 LIST concat APPEND 2x100 43.90 28.68 35.58 258 LIST concat APPEND 2x1000 314.86 398.74 360.97 259 LIST concat APPEND 2x10000 4443.52 3270.56 3641.69 260 LIST concat CONCAT 2x10 2.11 2.59 2.08 261 LIST concat CONCAT 2x100 2.40 2.95 3.66 262 LIST concat CONCAT 2x1000 11.37 14.66 16.82 263 LIST concat CONCAT 2x10000 94.09 120.80 118.73 264 LIST concat EVAL/LAPPEND 2x10 3.33 2.26 3.10 265 LIST concat EVAL/LAPPEND 2x100 8.78 6.58 4.82 266 LIST concat EVAL/LAPPEND 2x1000 27.84 23.55 22.21 267 LIST concat EVAL/LAPPEND 2x10000 162.88 166.83 197.87 268 LIST concat FOREACH/LAPPEND 2x10 4.05 3.68 2.67 269 LIST concat FOREACH/LAPPEND 2x100 24.54 19.89 19.38 270 LIST concat FOREACH/LAPPEND 2x1000 294.75 148.04 114.74 271 LIST concat FOREACH/LAPPEND 2x10000 2323.16 1659.77 1440.41 272 LIST concat SET 2x10 4.39 5.15 3.86 273 LIST concat SET 2x100 49.43 25.32 27.87 274 LIST concat SET 2x1000 602.37 265.39 249.79 275 LIST concat SET 2x10000 3755.34 3587.60 3293.78 276 LIST exact search, first item 1.10 1.81 1.70 277 LIST exact search, last item 3.65 7.22 5.33 278 LIST exact search, middle item 2.92 2.63 2.88 279 LIST exact search, non-item 9.68 11.92 8.56 280 LIST exact search, typed item 4.68 7.59 3.56 281 LIST exact search, untyped item 5.41 6.33 4.55 282 LIST index first element 1.51 1.48 2.71 283 LIST index last element 0.87 0.90 0.83 284 LIST index middle element 0.97 0.88 0.84 285 LIST insert an item at "end" 13.52 7.32 6.42 286 LIST insert an item at middle 10.85 7.91 7.48 287 LIST insert an item at start 10.88 8.01 6.48 288 LIST iterate list 161.31 191.27 282.19 289 LIST join list 80.15 70.15 91.06 290 LIST large, early range 1.81 2.55 1.88 291 LIST large, late range 1.96 1.85 2.28 292 LIST length, pure list 1.32 1.60 0.88 293 LIST list 2.97 5.55 2.40 294 LIST lset foreach l 257.62 401.03 296.82 295 LIST lset foreach list 266.06 364.72 317.73 296 LIST lset foreach ""s l 74.60 106.34 77.02 297 LIST lset foreach ""s list 67.04 102.36 113.52 298 LIST regexp search, first item 1.30 1.73 2.55 299 LIST regexp search, last item 16.66 17.37 205.27 300 LIST regexp search, non-item 26.28 37.43 352.70 301 LIST remove first element 8.28 11.82 7.94 302 LIST remove in mixed list 9.59 13.88 6.71 303 LIST remove last element 8.03 10.47 5.19 304 LIST remove middle element 7.99 8.13 6.33 305 LIST replace first el with multiple 11.30 11.39 6.70 306 LIST replace first element 9.14 17.73 5.78 307 LIST replace in mixed list 8.84 9.38 6.85 308 LIST replace last el with multiple 8.81 17.03 5.45 309 LIST replace last element 10.42 9.37 5.90 310 LIST replace middle el with multiple 8.01 14.37 5.80 311 LIST replace middle element 8.65 12.03 5.85 312 LIST replace range 2.66 3.74 9.99 313 LIST reverse core 7.17 8.69 8.5+ 314 LIST reverse lappend 179.52 195.70 221.17 315 LIST small, early range 1.25 1.45 1.16 316 LIST small, late range 1.31 1.74 1.23 317 LIST sort 131.08 157.03 245.23 318 LIST sorted search, first item 1.67 1.55 1.66 319 LIST sorted search, last item 1.35 2.37 1.48 320 LIST sorted search, middle item 1.27 2.44 1.93 321 LIST sorted search, non-item 1.32 2.09 1.21 322 LIST sorted search, typed item 1.55 2.30 1.59 323 LIST typed sort 94.38 125.59 189.22 324 LOOP for (to 1000) 78.10 130.89 94.09 325 LOOP for, iterate list 123.46 266.84 218.02 326 LOOP for, iterate string 220.41 336.93 276.39 327 LOOP foreach, iterate list 170.04 243.33 100.35 328 LOOP foreach, iterate string 220.51 277.28 118.68 329 LOOP while (to 1000) 89.27 124.87 74.91 330 LOOP while 1 (to 1000) 85.03 132.67 81.86 331 MAP ([chars])-case regsub 18.80 37.06 28.50 332 MAP http mapReply 4884.75 7608.08 6931.14 333 MAP regsub -nocase, no match 118.29 166.07 109.86 334 MAP regsub 1 val 36.29 112.82 100.58 335 MAP regsub 1 val -nocase 71.30 192.40 138.36 336 MAP regsub 2 val 107.02 391.01 245.74 337 MAP regsub 2 val -nocase 146.55 339.43 431.85 338 MAP regsub 3 val 162.88 399.01 337.44 339 MAP regsub 3 val -nocase 224.85 645.03 573.67 340 MAP regsub 4 val 192.72 543.18 470.85 341 MAP regsub 4 val -nocase 230.31 758.15 581.64 342 MAP regsub short 2.14 5.98 3.53 343 MAP regsub, no match 45.01 70.14 40.61 344 MAP string -nocase, no match 159.37 351.99 227.01 345 MAP string 1 val 31.61 114.70 95.27 346 MAP string 1 val -nocase 88.15 150.98 137.16 347 MAP string 2 val 123.67 261.09 226.90 348 MAP string 2 val -nocase 160.17 335.86 315.60 349 MAP string 3 val 167.42 260.57 259.78 350 MAP string 3 val -nocase 236.06 458.77 451.69 351 MAP string 4 val 206.90 478.86 352.49 352 MAP string 4 val -nocase 231.35 611.23 544.57 353 MAP string short 2.34 5.82 4.45 354 MAP string, no match 80.13 179.68 140.83 355 MAP |-case regsub 12.71 17.93 20.33 356 MAP |-case strmap 2.55 4.91 4.67 357 MATRIX mult 5x5 80.85 114.99 83.01 358 MATRIX mult 10x10 597.01 790.93 582.34 359 MATRIX mult 15x15 1833.77 2763.88 1772.71 360 MATRIX transposition-0 491.24 790.94 461.16 361 MATRIX transposition-1 272.40 372.38 459.27 362 MD5 msg len 10 175.87 191.80 192.30 363 MD5 msg len 100 280.75 524.55 307.88 364 MD5 msg len 1000 2099.28 3945.55 2131.80 365 MD5 msg len 10000 58766.55 85647.10 19223.20 366 MTHD array stored proc call 0.94 1.94 1.09 367 MTHD call absolute 1.86 3.69 2.14 368 MTHD call relative 1.87 5.96 2.69 369 MTHD direct ns proc call 0.50 1.02 1.59 370 MTHD imported ns proc call 0.56 1.64 0.66 371 MTHD indirect proc eval 1.96 4.39 2.46 372 MTHD indirect proc eval #2 2.74 2.90 3.16 373 MTHD inline call 0.29 0.43 0.39 374 MTHD interp alias proc call 1.03 1.08 0.89 375 MTHD ns lookup call 7.31 12.95 6.65 376 MTHD switch method call 1.95 5.18 4.02 377 NS alternating 45.68 250.52 187.59 378 PARSE html form upload (7978) 1541.64 1704.70 1828.76 379 PARSE html form upload (993570) 180402.8 226687.0 208756.9 380 PROC do-nothing, no args 0.50 1.16 0.52 381 PROC do-nothing, one arg 0.45 1.12 0.75 382 PROC empty, no args 0.13 0.19 0.19 383 PROC empty, use args 0.14 0.19 0.18 384 PROC explicit return 0.64 0.85 0.64 385 PROC explicit return (2) 0.71 1.04 0.56 386 PROC explicit return (3) 1.66 1.48 0.57 387 PROC heavily commented 0.75 1.24 0.58 388 PROC implicit return 0.86 0.80 0.61 389 PROC implicit return (2) 0.49 1.29 0.61 390 PROC implicit return (3) 0.48 0.56 0.58 391 PROC local links with global 32.75 38.45 72.01 392 PROC local links with upvar 24.68 41.35 55.52 393 PROC local links with variable 26.11 34.13 48.45 394 RE 1-char long-end 5.94 8.58 9.35 395 RE 1-char long-end catching 10.74 15.64 11.58 396 RE 1-char long-middle 4.13 5.96 5.02 397 RE 1-char long-middle catching 7.19 13.67 11.93 398 RE 1-char long-start 1.57 2.63 2.84 399 RE 1-char long-start catching 6.74 9.84 7.23 400 RE 1-char short 1.41 2.94 2.04 401 RE 1-char short catching 6.10 11.32 10.75 402 RE basic 2.03 2.36 2.51 403 RE basic catching 7.34 11.08 9.02 404 RE c-comment long 6.76 15.97 9.11 405 RE c-comment long catching 24.40 34.46 25.07 406 RE c-comment long nomatch 9.90 15.27 15.01 407 RE c-comment long nomatch catching 11.14 20.46 14.84 408 RE c-comment long pmatch 9.71 25.14 16.12 409 RE c-comment long pmatch catching 15.01 18.62 17.17 410 RE c-comment many *s 12.30 19.56 14.89 411 RE c-comment many *s catching 33.96 51.71 42.19 412 RE c-comment nomatch 1.77 4.85 2.41 413 RE c-comment nomatch catching 2.95 5.34 4.88 414 RE c-comment simple 4.12 10.31 5.28 415 RE c-comment simple catching 19.44 29.07 24.74 416 RE count all matches 15.27 20.41 37.79 417 RE extract all matches 17.92 26.38 29.67 418 RE ini file 8076.56 12178.11 9331.67 419 RE ini file ng 52.13 82.04 51.97 420 RE literal regexp 2.82 2.98 6.59 421 RE n-char long-end 6.09 8.96 7.33 422 RE n-char long-end catching 11.34 17.96 13.99 423 RE n-char long-middle 4.02 6.41 5.55 424 RE n-char long-middle catching 9.48 15.61 16.16 425 RE n-char long-start 1.87 3.55 2.87 426 RE n-char long-start catching 7.05 11.51 9.77 427 RE n-char short 2.54 3.24 2.27 428 RE n-char short catching 9.00 9.53 11.13 429 RE static anchored match 0.59 1.09 1.00 430 RE static anchored match dot 0.50 1.16 4.36 431 RE static anchored nomatch 0.49 0.80 0.73 432 RE static anchored nomatch dot 0.49 0.83 1.43 433 RE static l-anchored match 0.99 2.08 0.64 434 RE static l-anchored nomatch 0.69 0.78 0.72 435 RE static long match 1.86 2.82 2.58 436 RE static long nomatch 1.99 3.63 3.85 437 RE static r-anchored match 0.52 0.94 0.70 438 RE static r-anchored nomatch 0.51 0.80 0.80 439 RE static short match 0.72 1.26 0.66 440 RE static short nomatch 0.70 1.09 0.63 441 RE var ***= directive match 1.38 2.03 2.87 442 RE var ***= directive nomatch 1.47 2.54 3.60 443 RE var . match 1.19 1.60 2.15 444 RE var [0-9] match 3.98 3.76 3.46 445 RE var \d match 2.58 4.41 3.16 446 RE var ^$ nomatch 1.05 1.42 2.08 447 RE var backtrack case 3.34 38.22 3.72 448 RE var-based regexp 2.88 4.56 7.39 449 READ 595K, cat 22741.32 37974.55 29677.63 450 READ 595K, gets 14896.05 24375.58 17568.00 451 READ 595K, glob-grep match 22517.66 32772.21 26302.91 452 READ 595K, glob-grep nomatch 22146.32 31328.56 25170.46 453 READ 595K, read 5072.98 7692.06 5854.03 454 READ 595K, read & size 5578.37 8507.96 5933.23 455 READ 595K, read dyn buf 4862.90 9821.42 5529.71 456 READ 595K, read small buf 106932.1 156669.0 138987.8 457 READ 3050b, cat 121.37 267.86 233.17 458 READ 3050b, gets 135.74 155.98 131.29 459 READ 3050b, glob-grep match 119.92 188.83 145.08 460 READ 3050b, glob-grep nomatch 145.14 221.84 151.13 461 READ 3050b, read 38.50 58.28 44.12 462 READ 3050b, read & size 47.24 67.14 61.23 463 READ 3050b, read dyn buf 36.86 67.70 50.90 464 READ 3050b, read small buf 460.55 670.94 757.44 465 READ bin 595K, cat 13311.96 16066.91 34526.71 466 READ bin 595K, gets 7884.47 12720.75 20417.14 467 READ bin 595K, glob-grep match 10776.52 15214.41 27593.71 468 READ bin 595K, glob-grep nomatch 11543.41 12172.33 26651.49 469 READ bin 595K, read 1256.75 1668.86 931.63 470 READ bin 595K, read & size 1466.92 1463.90 1125.67 471 READ bin 595K, read dyn buf 1315.47 1755.47 1098.49 472 READ bin 595K, read small buf 100468.0 140927.3 130969.2 473 READ bin 3050b, cat 98.55 149.79 241.31 474 READ bin 3050b, gets 77.15 96.43 125.96 475 READ bin 3050b, glob-grep match 81.42 159.13 230.76 476 READ bin 3050b, glob-grep nomatch 81.31 147.69 234.36 477 READ bin 3050b, read 29.05 50.95 34.41 478 READ bin 3050b, read & size 31.64 64.13 33.84 479 READ bin 3050b, read dyn buf 30.87 55.41 49.80 480 READ bin 3050b, read small buf 418.44 751.76 738.88 481 SHA1 msg len 10 238.99 311.44 373.55 482 SHA1 msg len 100 456.79 552.35 550.49 483 SHA1 msg len 1000 2962.13 4968.88 5505.85 484 SHA1 msg len 10000 29768.60 40934.00 42375.00 485 SPLIT iter, 4000 uchars 1168.39 1280.69 638.34 486 SPLIT iter, 4010 chars 1096.38 1236.55 631.76 487 SPLIT iter, rand 100 c 40.14 52.60 33.54 488 SPLIT iter, rand 1000 c 358.84 353.56 195.19 489 SPLIT iter, rand 10000 c 2216.71 3266.38 1433.12 490 SPLIT on 'c', 4000 uchars 43.59 58.92 34.89 491 SPLIT on 'c', 4010 chars 42.71 54.11 38.54 492 SPLIT on 'cz', 4000 uchars 114.24 155.81 100.91 493 SPLIT on 'cz', 4010 chars 93.93 148.28 89.87 494 SPLIT on 'cû', 4000 uchars 157.89 182.68 103.27 495 SPLIT on 'cû', 4010 chars 89.52 131.61 95.43 496 SPLIT, 4000 uchars 321.99 252.73 219.71 497 SPLIT, 4010 chars 190.45 215.16 169.80 498 SPLIT, rand 100 c 20.81 28.56 22.85 499 SPLIT, rand 1000 c 173.52 137.74 148.35 500 SPLIT, rand 10000 c 916.60 788.00 620.36 501 STR append 3.21 4.75 4.74 502 STR append (1KB + 1KB) 2.17 3.15 2.18 503 STR append (1MB + (1b+1K+1b)*100) 1988.50 674.11 3919.68 504 STR append (1MB + 1KB) 1671.57 1846.95 2942.22 505 STR append (1MB + 1KB*20) 1686.69 1950.86 2538.61 506 STR append (1MB + 1KB*1000) 2649.95 4014.85 2724.80 507 STR append (1MB + 1MB*3) 2898.98 3893.80 13261.46 508 STR append (1MB + 1MB*5) 11283.40 9212.57 16403.86 509 STR append (1MB + 2b*1000) 554.03 531.04 420.44 510 STR append (10KB + 1KB) 3.77 5.47 4.23 511 STR first (failure) 7.50 11.64 11.18 512 STR first (failure) utf 8.00 13.88 8.21 513 STR first (success) 1.23 2.15 1.38 514 STR first (success) utf 0.82 2.00 1.31 515 STR first (total failure) 6.64 7.40 9.39 516 STR first (total failure) utf 5.47 7.80 6.07 517 STR index 0 1.72 1.61 1.13 518 STR index 100 1.42 1.71 1.37 519 STR index 500 1.09 1.96 1.41 520 STR info locals match 36.98 31.45 48.34 521 STR last (failure) 7.86 18.32 16.12 522 STR last (success) 1.37 2.48 1.20 523 STR last (total failure) 7.95 6.80 6.10 524 STR length (==4010) 0.89 1.25 1.89 525 STR length growing (1000) 217.30 186.20 135.55 526 STR length growing uc (1000) 250.35 183.71 143.68 527 STR length of a LIST 0.75 1.20 1.00 528 STR length static str 1.19 0.83 0.93 529 STR match, complex (failure) 6.95 12.50 10.31 530 STR match, complex (success early) 1.03 1.84 0.97 531 STR match, complex (success late) 11.81 19.47 15.39 532 STR match, complex (total failure) 5.66 7.97 5.16 533 STR match, exact (failure) 0.50 1.18 0.65 534 STR match, exact (success) 0.53 0.90 1.10 535 STR match, exact -nocase (failure) 0.62 1.25 0.62 536 STR match, exact -nocase (success) 0.93 1.61 1.10 537 STR match, recurse (fail backtrack) 55.41 80.34 54.35 538 STR match, recurse (fail bt1) 84.93 91.99 65.50 539 STR match, recurse (fail bt2) 85.32 75.61 50.77 540 STR match, recurse (fail ranchor) 7227.01 10080.35 10814.31 541 STR match, recurse (success bt2) 13.28 15.95 9.25 542 STR match, recurse2 (fail) 14558.25 20413.30 13371.66 543 STR match, recurse2 (success) 10.83 11.96 12.00 544 STR match, simple (failure) 0.56 1.68 0.76 545 STR match, simple (success) 0.52 1.28 0.70 546 STR range, index 100..200 of 4010 1.32 2.05 1.39 547 STR repeat, 4010 chars * 10 5.11 5.99 6.97 548 STR repeat, 4010 chars * 100 48.52 56.34 31.81 549 STR repeat, abcdefghij * 10 1.30 2.37 1.11 550 STR repeat, abcdefghij * 100 3.14 4.07 2.04 551 STR repeat, abcdefghij * 1000 10.55 17.22 13.76 552 STR replace, equal replacement 2.40 4.51 2.52 553 STR replace, longer replacement 3.52 3.87 2.49 554 STR replace, no replacement 2.12 3.65 1.84 555 STR reverse core, 10 c 1.82 2.77 8.5+ 556 STR reverse core, 10 uc 2.09 2.91 8.5+ 557 STR reverse core, 100 c 2.10 1.93 8.5+ 558 STR reverse core, 100 uc 1.83 2.42 8.5+ 559 STR reverse core, 400 c 1.99 2.74 8.5+ 560 STR reverse core, 400 uc 2.58 2.17 8.5+ 561 STR reverse iter/append, 10 c 5.38 5.87 5.61 562 STR reverse iter/append, 10 uc 5.80 7.47 5.49 563 STR reverse iter/append, 100 c 33.43 34.83 35.77 564 STR reverse iter/append, 100 uc 28.63 40.40 36.65 565 STR reverse iter/append, 400 c 105.46 154.97 133.90 566 STR reverse iter/append, 400 uc 123.42 172.34 130.62 567 STR reverse iter/set, 10 c 6.18 7.95 6.52 568 STR reverse iter/set, 10 uc 4.92 7.85 7.93 569 STR reverse iter/set, 100 c 41.93 47.14 50.26 570 STR reverse iter/set, 100 uc 38.07 58.05 49.99 571 STR reverse iter/set, 400 c 154.98 229.60 213.19 572 STR reverse iter/set, 400 uc 153.40 227.33 219.92 573 STR reverse recursive, 10 c 10.31 32.13 16.99 574 STR reverse recursive, 10 uc 9.03 24.38 14.89 575 STR reverse recursive, 100 c 92.30 251.54 242.97 576 STR reverse recursive, 100 uc 91.34 247.10 180.58 577 STR reverse recursive, 400 c 508.56 1053.75 802.53 578 STR reverse recursive, 400 uc 863.50 1054.61 1065.13 579 STR str $a eq $b 1.62 1.64 1.20 580 STR str $a eq $b (same obj) 1.19 1.73 1.52 581 STR str $a equal "" 0.98 1.57 0.91 582 STR str $a ne $b 1.52 1.72 1.26 583 STR str $a ne $b (same obj) 1.45 1.62 1.46 584 STR str num == "" 0.91 1.68 1.06 585 STR strcmp bin long eq 11.49 10.73 9.65 586 STR strcmp bin long neq 14.05 14.31 9.36 587 STR strcmp bin long neqS 4.19 8.16 3.65 588 STR strcmp bin short eq 3.00 3.62 2.03 589 STR streq bin long eq 10.40 217.92 175.89 590 STR streq bin long neq 10.61 242.43 188.39 591 STR streq bin long neqS 6.20 214.95 222.99 592 STR streq bin short eq 3.72 5.47 3.92 593 STR string compare 1.28 1.87 1.28 594 STR string compare "" 1.01 2.26 1.62 595 STR string compare long 4.20 4.99 3.42 596 STR string compare long (same obj) 0.96 1.54 1.52 597 STR string compare mixed long 19.02 35.29 23.73 598 STR string compare uni long 21.70 36.18 22.83 599 STR string equal "" 1.12 1.96 2.59 600 STR string equal long (!= len) 1.88 2.18 1.78 601 STR string equal long (== len) 4.75 6.23 4.66 602 STR string equal long (same obj) 1.77 1.80 1.50 603 STR string equal mixed long 1.57 2.09 1.32 604 STR string equal uni long 5.35 6.77 6.81 605 STR/LIST length, obj shimmer 210.62 190.65 143.34 606 SWITCH 1st true 0.59 0.67 8.03 607 SWITCH 2nd true 0.80 0.75 7.99 608 SWITCH 9th true 0.92 1.11 10.16 609 SWITCH default true 0.89 1.04 7.61 610 TRACE all set (rwu) 1.07 2.07 3.65 611 TRACE no trace set 1.17 1.62 2.36 612 TRACE read 1.22 2.00 2.99 613 TRACE unset 1.46 1.68 4.40 614 TRACE write 1.37 2.05 4.49 615 UNSET catch var !exist 7.77 6.92 4.27 616 UNSET catch var exists 0.69 0.98 1.18 617 UNSET info check var !exist 0.61 1.06 2.44 618 UNSET info check var exists 0.55 1.25 2.09 619 UNSET nocomplain var !exist 0.56 1.30 5.52 620 UNSET nocomplain var exists 0.58 1.35 4.17 621 UNSET var exists 0.69 1.07 1.13 622 UPLEVEL none 210.36 274.60 258.17 623 UPLEVEL primed 583.61 670.03 8032.84 624 UPLEVEL to nseval 1129.53 970.30 11301.26 625 UPLEVEL to proc 1121.16 840.31 11875.00 626 VAR 'array set' of 100 elems 39.13 10.60 16.13 627 VAR 100 'set's in array 11.79 7.83 13.67 628 VAR access global 1.33 1.49 1.22 629 VAR access local proc arg 0.61 1.09 0.87 630 VAR access locally set 0.85 0.86 0.71 631 VAR access upvar 1.24 1.11 1.40 632 VAR incr global var 1000x 225.07 186.92 241.42 633 VAR incr local var 1000x 269.30 191.12 275.57 634 VAR incr upvar var 1000x 237.71 179.54 204.77 635 VAR mset 1.90 3.62 2.74 636 VAR mset (foreach) 2.18 1.11 1.17 637 VAR ref absolute 99.86 40.50 54.71 638 VAR ref local 8.21 3.98 5.84 639 VAR ref variable 4.97 4.15 16.34 640 VAR set array element 1.28 1.03 2.91 641 VAR set scalar 1.55 0.58 0.72 642 WORDCOUNT wc1 309.48 366.92 408.00 643 WORDCOUNT wc2 233.70 73.20 104.60 644 WORDCOUNT wc3 187.32 57.45 89.78 644 BENCHMARKS 1:8.6.0 2:8.5.7 3:8.4.19 000 VERSIONS: 1:8.6.0 2:8.5.7 3:8.4.19 001 CANVAS cget/incr -width 3.01 2.05 2.74 002 CANVAS configure -bg 1.56 1.45 1.16 003 CANVAS configure all 21.42 14.81 10.89 004 CANVAS create 50.39 90.00 23.23 005 CANVAS create (one exists) 31.90 44.71 18.23 006 CANVAS draw-3 100 5325.59 5482.63 1982.27 007 CANVAS simple draw 10 698.76 555.22 217.89 008 CANVAS simple draw 100 5045.62 8233.86 2083.97 009 CANVAS simple draw 1000 53576.93 65970.76 23968.62 010 ENTRY create 117.40 114.67 58.27 011 ENTRY create (one exists) 65.23 51.11 33.45 012 STARTUP time to launch wish 110827.1 135853.4 219549.6 012 BENCHMARKS 1:8.6.0 2:8.5.7 3:8.4.19