[Jeffrey Hobbs]: There have been discussions about the changing relative speed of Tcl over the years (primarily rotating around the addition of the byte-code compiler - faster, but then also the changes to support i18n - slower). I created the tclbench [http://tcllib.sf.net/] application to get a better understanding of what has truly happened to performance over the years, with the forward looking view of finding the pain points and fixing them. Anyone can get tclbench from CVS [http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tcllib/] to do relative benchmarks themselves, but below I've posted the results from a full run over the benchmark suite. The numbers are microseconds, but you should only look at them relative to each other. There is some fluctuation expected as Tcl's 'time' does wall timing, not true cpu time. In any case, these were done on a dual P3-550 with 512MB physmem RedHat7.0 box. Dual doesn't make any difference - all interpreters were compiled static with no threads with the exception of 8.3 which is the RH7 default build (shared, -O2). Except for 8.4a3, all represent the final code of that version. 8.4a3 is the head CVS code as of May 31, 2001. A few have noted that these numbers aren't the easiest to read overall, which I can agree with. Take a look at the [Tcl Normalized Benchmarks] that set 8.4a3 as a norm of 1.0 to compare against. If you've got BLT handy, then here is a little code for [Plotting Tcl Benchmarks]. The speed enhancements in 8.4 are primarily achieved by work done by myself and Eric Melski at Ajuba and continued at [ActiveState] [http://www.activestate.com/]. ---- TCL_INTERP: 1:8.4a3 2:8.3.1 3:8.2.3 4:8.0.5 5:7.6p2 STARTED 2001-06-01 04:51:01 (runbench.tcl v1.10) Benchmark 1:8.4a3 /home/jeffh/install/linux-ix86/bin/tclsh8.4 bccdeefhkllmmmmprrssstuvw 00:05:31 elapsed Benchmark 2:8.3.1 /usr/bin/tclsh8.3 bccdeefhkllmmmmprrssstuvw 00:07:46 elapsed Benchmark 3:8.2.3 /home/jeffh/install/linux-ix86/bin/tclsh8.2 bccdeefhkllmmmmprrssstuvw 00:07:20 elapsed Benchmark 4:8.0.5 /home/jeffh/install/linux-ix86/bin/tclsh8.0 bccdeefhkllmmmmprrssstuvw 00:06:13 elapsed Benchmark 5:7.6p2 /home/jeffh/install/linux-ix86/bin/tclsh7.6 bccdeefhkllmmmmprrssstuvw 00:35:12 elapsed 000 VERSIONS: 1:8.4a3 2:8.3.1 3:8.2.3 4:8.0.5 5:7.6p2 001 BASE64 decode 10 508 542 487 -=- -=- 002 BASE64 decode 100 4082 4608 4076 -=- -=- 003 BASE64 decode 1000 40098 45223 41061 -=- -=- 004 BASE64 decode 10000 404342 452186 409902 -=- -=- 005 BASE64 decode2 10 468 530 481 -=- -=- 006 BASE64 decode2 100 3900 4367 3914 -=- -=- 007 BASE64 decode2 1000 38056 43515 39410 -=- -=- 008 BASE64 decode2 10000 377203 438234 397320 -=- -=- 009 BASE64 encode 10 454 438 399 -=- -=- 010 BASE64 encode 100 2850 3671 3324 -=- -=- 011 BASE64 encode 1000 28178 36577 33607 -=- -=- 012 BASE64 encode 10000 279258 366992 335106 -=- -=- 013 BASE64 encode2 10 348 411 375 -=- -=- 014 BASE64 encode2 100 2527 3716 3453 -=- -=- 015 BASE64 encode2 1000 24753 33423 30927 -=- -=- 016 BASE64 encode2 10000 253009 338375 312150 -=- -=- 017 CATCH no catch used 3 3 3 3 5 018 CATCH return error 34 33 31 33 20 019 CATCH return ok 3 3 3 3 10 020 DATA access in a list 1566 2167 1789 1649 41578 021 DATA access in an array 2140 2266 2329 1750 7928 022 DATA create in a list 1073 2747 2225 2097 7365 023 DATA create in an array 2857 2780 2810 3628 9105 024 EVAL cmd and mixed lists 1470 1455 3892 2774 568 025 EVAL cmd eval as list 9 10 28 26 11 026 EVAL cmd eval as string 25 30 30 28 12 027 EVAL cmd eval in list obj var 10 12 30 27 15 028 EVAL list cmd and mixed lists 1435 1431 3923 2763 588 029 EVAL list cmd and pure lists 252 239 3894 2772 569 030 EXPR braced 13 14 12 10 79 031 EXPR fifty operands 23 22 22 19 84 032 EXPR incr with expr 4 5 3 3 16 033 EXPR incr with incr 5 5 5 3 11 034 EXPR inline 15 14 13 11 37 035 EXPR one operand 3 3 3 3 14 036 EXPR ten operands 7 7 7 6 28 037 EXPR unbraced 98 99 93 72 79 038 FCOPY binary: 160K 5372 5420 5294 -=- -=- 039 FCOPY encoding: 160K 23150 5495 5388 -=- -=- 040 FCOPY std: 160K 5319 5397 5484 5909 6049 041 HEAPSORT size 10 605 642 618 4839 3448 042 HEAPSORT size 50 4072 4227 4029 28260 26561 043 HEAPSORT size 100 9334 9624 9060 59311 61673 044 IF else true al 15 16 16 11 42 045 IF else true numeric 8 7 8 7 40 046 IF elseif true al 15 16 14 12 41 047 IF elseif true numeric 8 7 8 7 43 048 IF if false al/al 10 11 9 8 31 049 IF if false al/num 9 10 8 8 56 050 IF if false num/num 6 6 6 6 33 051 IF if true al 10 12 9 8 34 052 IF if true al/al 10 12 10 8 31 053 IF if true num/num 6 6 6 6 32 054 IF if true numeric 6 6 6 6 30 055 IF multi 1st true 6 6 6 6 46 056 IF multi 2nd true 8 7 7 7 51 057 IF multi 9th true 16 15 16 16 90 058 IF multi default true 16 15 15 14 87 059 KLIST shuffle0 llength 1 54 88 74 74 8.0+ 060 KLIST shuffle0 llength 10 142 247 221 197 8.0+ 061 KLIST shuffle0 llength 100 1205 1996 1836 1557 8.0+ 062 KLIST shuffle0 llength 1000 13473 21607 19743 16814 8.0+ 063 KLIST shuffle0 llength 10000 181108 259874 242233 206740 -=- 064 KLIST shuffle1-s llength 1 51 60 48 35 123 065 KLIST shuffle1-s llength 10 203 296 252 207 940 066 KLIST shuffle1-s llength 100 3033 3824 3018 2383 16278 067 KLIST shuffle1-s llength 1000 295796 304262 248357 241626 940421 068 KLIST shuffle1a llength 1 52 68 56 41 156 069 KLIST shuffle1a llength 10 246 332 302 244 1236 070 KLIST shuffle1a llength 100 2104 3193 2710 2317 20787 071 KLIST shuffle1a llength 1000 21138 32162 27654 22460 1163626 072 KLIST shuffle1a llength 10000 216413 326476 281614 229894 -=- 073 KLIST shuffle2 llength 1 51 71 64 75 157 074 KLIST shuffle2 llength 10 253 342 293 365 1037 075 KLIST shuffle2 llength 100 2374 2987 2692 3406 10308 076 KLIST shuffle2 llength 1000 24349 30386 27674 34005 101137 077 KLIST shuffle2 llength 10000 268951 323133 299880 369065 -=- 078 KLIST shuffle3 llength 1 42 69 57 46 118 079 KLIST shuffle3 llength 10 171 309 258 237 905 080 KLIST shuffle3 llength 100 1600 2805 2434 2072 10851 081 KLIST shuffle3 llength 1000 17210 29430 25505 21433 354190 082 KLIST shuffle3 llength 10000 390842 536090 489058 439680 -=- 083 KLIST shuffle4 llength 1 43 70 60 48 131 084 KLIST shuffle4 llength 10 178 324 276 260 1046 085 KLIST shuffle4 llength 100 1698 3004 2646 2167 14333 086 KLIST shuffle4 llength 1000 16570 29538 26007 21520 675703 087 KLIST shuffle4 llength 10000 166191 299936 263511 219683 -=- 088 KLIST shuffle5-s llength 1 22 27 22 18 88 089 KLIST shuffle5-s llength 10 151 188 144 118 660 090 KLIST shuffle5-s llength 100 1736 1875 1570 1212 7483 091 KLIST shuffle5-s llength 1000 78405 80311 65372 58870 210923 092 KLIST shuffle5a llength 1 25 29 26 21 103 093 KLIST shuffle5a llength 10 146 168 145 120 774 094 KLIST shuffle5a llength 100 1317 1527 1302 1127 9440 095 KLIST shuffle5a llength 1000 14959 16159 14282 11996 275093 096 KLIST shuffle5a llength 10000 369635 384032 359252 334317 -=- 097 LIST append to list 279 229 306 293 234 098 LIST exact search, first item 6 9 6 6 422 099 LIST exact search, last item 36 33 32 29 436 100 LIST exact search, middle item 15 13 13 11 427 101 LIST exact search, non-item 107 96 97 91 453 102 LIST exact search, typed item 30 34 32 29 433 103 LIST exact search, untyped item 36 39 32 29 432 104 LIST index first element 5 7 6 5 142 105 LIST index last element 5 7 6 5 177 106 LIST index middle element 5 7 6 5 162 107 LIST insert an item at "end" 121 120 119 116 378 108 LIST insert an item at middle 127 131 129 128 240 109 LIST insert an item at start 130 125 131 124 222 110 LIST iterate list 2400 3844 3562 3320 353293 111 LIST join list 655 672 667 440 1135 112 LIST large, early range 14 17 14 11 177 113 LIST large, late range 14 15 15 11 184 114 LIST length, pure list 5 7 6 9 503 115 LIST remove first element 130 132 128 123 194 116 LIST remove in mixed list 135 1090 1074 135 240 117 LIST remove last element 124 126 126 122 257 118 LIST remove middle element 128 125 125 130 234 119 LIST replace first el with multiple 130 131 130 126 231 120 LIST replace first element 122 121 124 119 222 121 LIST replace in mixed list 136 1084 1066 131 240 122 LIST replace last el with multiple 126 128 122 125 397 123 LIST replace last element 122 121 120 124 386 124 LIST replace middle el with multiple 128 124 130 123 324 125 LIST replace middle element 125 126 129 118 316 126 LIST replace range 121 119 118 124 279 127 LIST small, early range 11 11 9 7 150 128 LIST small, late range 9 12 9 7 176 129 LIST sort 1527 1519 1487 1410 1508 130 LIST sorted search, first item 8 7 6 6 420 131 LIST sorted search, last item 8 34 34 29 433 132 LIST sorted search, middle item 8 14 13 11 430 133 LIST sorted search, non-item 8 94 93 90 450 134 LIST sorted search, typed item 8 34 31 30 435 135 LIST typed sort 1461 1369 1337 1084 5394 136 LOOP for (to 1000) 1679 1539 1601 1446 12827 137 LOOP for, iterate list 2182 2884 2685 2453 147524 138 LOOP for, iterate string 3451 5664 4493 3730 40463 139 LOOP foreach, iterate list 1254 1141 1182 1075 3651 140 LOOP foreach, iterate string 1489 2200 2177 1849 3465 141 LOOP while (to 1000) 1674 1534 1588 1442 13260 142 MAP regsub -nocase, no match 697 1725 1690 960 1499 143 MAP regsub 1 val 2477 2574 2944 461 1062 144 MAP regsub 1 val -nocase 2529 2540 2939 652 1296 145 MAP regsub 2 val 11631 11241 12996 1175 2051 146 MAP regsub 2 val -nocase 11615 11244 13029 1512 2509 147 MAP regsub 3 val 15572 15392 17694 1624 2658 148 MAP regsub 3 val -nocase 15464 15384 17721 2126 3280 149 MAP regsub 4 val 19433 19487 22367 2027 3216 150 MAP regsub 4 val -nocase 19413 19496 22350 2667 4004 151 MAP regsub short 111 111 120 28 56 152 MAP regsub, no match 659 1747 1613 636 996 153 MAP string -nocase, no match 3512 10609 10522 nomap nomap 154 MAP string 1 val 306 4325 4390 nomap nomap 155 MAP string 1 val -nocase 1829 5991 6171 nomap nomap 156 MAP string 2 val 852 5100 5184 nomap nomap 157 MAP string 2 val -nocase 3346 8393 8290 nomap nomap 158 MAP string 3 val 1038 5962 6243 nomap nomap 159 MAP string 3 val -nocase 4320 11047 10744 nomap nomap 160 MAP string 4 val 1311 6505 6708 nomap nomap 161 MAP string 4 val -nocase 5230 12513 12342 nomap nomap 162 MAP string short 18 24 23 nomap nomap 163 MAP string, no match 543 6008 6265 nomap nomap 164 MATRIX mult 5x5 499 753 667 606 3765 165 MATRIX mult 10x10 3212 4344 4101 3568 27976 166 MATRIX mult 15x15 10168 13468 12606 11098 97049 167 MATRIX transposition-0 4598 13071 10577 9912 30461 168 MATRIX transposition-1 3211 7983 6908 6086 110408 169 MD5 msg len 10 1533 1554 1420 1443 -=- 170 MD5 msg len 50 1788 1522 1379 1365 -=- 171 MD5 msg len 100 2726 2684 2436 2445 -=- 172 MD5 msg len 500 9923 10010 8842 9070 -=- 173 MD5 msg len 1000 19789 18878 17902 17796 -=- 174 MD5 msg len 5000 97363 93849 84886 87793 -=- 175 MD5 msg len 10000 194751 197648 170329 174871 -=- 176 MTHD array stored proc call 5 6 5 4 -=- 177 MTHD direct ns proc call 3 3 3 3 -=- 178 MTHD imported ns proc call 3 3 3 3 -=- 179 MTHD indirect proc eval 14 14 32 30 -=- 180 MTHD indirect proc eval #2 26 29 30 33 -=- 181 MTHD inline call 2 2 1 1 -=- 182 MTHD interp alias proc call 9 12 10 5 -=- 183 MTHD ns lookup call 48 54 67 55 -=- 184 MTHD switch method call 20 23 40 40 -=- 185 PROC do-nothing, no args 3 2 15 2 1 186 PROC do-nothing, one arg 3 3 3 3 4 187 PROC explicit return 3 4 4 4 6 188 PROC explicit return (2) 5 3 3 3 5 189 PROC explicit return (3) 3 3 3 3 4 190 PROC heavily commented 3 3 3 3 187 191 PROC implicit return 3 3 3 3 7 192 PROC implicit return (2) 3 3 3 3 5 193 PROC implicit return (3) 3 3 3 3 4 194 PROC local links with global 642 594 640 580 1620 195 PROC local links with upvar 586 541 552 533 1610 196 PROC local links with variable 549 509 521 286 1607 197 RE 1-char long-end 49 47 50 618 621 198 RE 1-char long-end catching 100 91 93 636 629 199 RE 1-char long-middle 32 33 33 315 330 200 RE 1-char long-middle catching 77 74 73 334 342 201 RE 1-char long-start 17 17 16 11 48 202 RE 1-char long-start catching 61 59 57 28 64 203 RE 1-char short 17 17 16 11 13 204 RE 1-char short catching 60 57 60 28 22 205 RE basic 14 15 13 11 14 206 RE basic catching 65 63 62 26 23 207 RE c-comment long 61 59 62 99 126 208 RE c-comment long catching 187 186 188 120 145 209 RE c-comment long nomatch 85 84 84 17 93 210 RE c-comment long nomatch catching 85 83 83 18 89 211 RE c-comment long pmatch 99 94 95 562 636 212 RE c-comment long pmatch catching 94 93 94 565 640 213 RE c-comment many *s 99 101 99 164 236 214 RE c-comment many *s catching 305 297 300 203 274 215 RE c-comment nomatch 21 23 21 9 13 216 RE c-comment nomatch catching 21 23 22 10 14 217 RE c-comment simple 38 36 36 20 24 218 RE c-comment simple catching 144 130 141 39 34 219 RE count all matches 105 91 305 254 519 220 RE extract all matches 130 111 371 295 680 221 RE literal regexp 24 23 23 15 16 222 RE n-char long-end 49 48 48 692 693 223 RE n-char long-end catching 104 99 105 711 704 224 RE n-char long-middle 33 33 32 353 366 225 RE n-char long-middle catching 88 90 87 371 383 226 RE n-char long-start 19 18 20 11 48 227 RE n-char long-start catching 70 70 69 29 60 228 RE n-char short 17 23 16 11 13 229 RE n-char short catching 69 67 67 28 24 230 RE var-based regexp 25 24 24 16 22 231 READ 595K, gets 188172 203246 179708 98496 189814 232 READ 595K, read 39390 45851 51974 226434 218000 233 READ 595K, read & size 44746 51667 46795 18562 213308 234 READ 3050b, gets 1024 1097 957 549 1013 235 READ 3050b, read 260 276 271 141 176 236 READ 3050b, read & size 277 293 287 154 197 237 READ bin 595K, gets 196471 208773 184166 96986 187679 238 READ bin 595K, read 9485 9475 9626 222225 213271 239 READ bin 595K, read & size 9703 9992 9777 19006 212072 240 READ bin 3050b, gets 1100 1152 1011 562 1028 241 READ bin 3050b, read 122 129 119 160 182 242 READ bin 3050b, read & size 139 146 134 171 204 243 SHA sha1 msg len 10 3990 4334 3932 4114 -=- 244 SHA sha1 msg len 100 7395 7650 7614 7612 -=- 245 SHA sha1 msg len 1000 56818 59375 55107 57698 -=- 246 SHA sha1 msg len 10000 556833 585613 539377 559134 -=- 247 SHA sha1DF msg len 10 1734 2130 2017 1740 -=- 248 SHA sha1DF msg len 100 3178 4339 4142 3366 -=- 249 SHA sha1DF msg len 1000 25128 32032 29978 26688 -=- 250 SHA sha1DF msg len 10000 236464 313819 295352 259483 -=- 251 STARTUP time to launch tclsh 8907 11005 8916 10448 4146 252 STR append 58 59 46 39 247 253 STR append (1KB + 1KB) 23 36 30 22 155 254 STR append (1MB + (1b + 1K + 1b) * 100) 7777 15813 15689 15605 117148 255 STR append (1MB + 1KB * 20) 6606 14866 14740 14829 113469 256 STR append (1MB + 1KB * 1000) 14991 23590 23219 22908 157438 257 STR append (1MB + 1KB) 6445 14665 14633 14658 112314 258 STR append (1MB + 1MB * 3) 30202 37489 37095 37346 326752 259 STR append (1MB + 1MB * 5) 37650 74239 74462 74473 425884 260 STR append (1MB + 2b * 1000) 8575 18656 18390 17959 119100 261 STR append (10KB + 1KB) 75 94 91 79 659 262 STR first (failure) 58 35 35 33 189 263 STR first (success) 8 9 8 6 154 264 STR first (total failure) 51 16 16 16 187 265 STR index 0 10 12 10 8 185 266 STR index 100 10 13 10 8 177 267 STR index 500 15 15 10 8 183 268 STR info locals match 462 484 500 437 1469 269 STR last (failure) 79 67 81 56 195 270 STR last (success) 7 143 134 6 195 271 STR last (total failure) 67 45 73 35 180 272 STR length (==4010) 5 7 6 5 183 273 STR length of a LIST 5 7 6 5 174 274 STR length static str 3 5 6 5 20 275 STR match, complex (failure) 72 633 584 293 386 276 STR match, complex (success early) 9 14 11 8 148 277 STR match, complex (success late) 89 644 595 303 391 278 STR match, complex (total failure) 61 620 576 292 381 279 STR match, simple (failure) 7 8 6 5 146 280 STR match, simple (success early) 7 8 6 5 146 281 STR match, simple (success late) 7 8 6 5 150 282 STR match, simple (total failure) 7 8 6 5 147 283 STR range, index 100..200 of 4010 12 12 10 7 181 284 STR repeat, 4010 chars * 10 100 197 187 222 1815 285 STR repeat, 4010 chars * 100 1792 3559 3501 3818 15752 286 STR repeat, abcdefghij * 10 6 13 12 41 177 287 STR repeat, abcdefghij * 100 16 40 41 331 1471 288 STR repeat, abcdefghij * 1000 118 315 318 3186 14458 289 STR replace, equal replacement 39 170 186 32 408 290 STR replace, longer replacement 40 179 187 32 409 291 STR replace, no replacement 36 167 176 33 409 292 STR reverse iter/append, 10 c 52 110 86 70 207 293 STR reverse iter/append, 10 uc 52 111 90 71 202 294 STR reverse iter/append, 100 c 344 912 685 593 1930 295 STR reverse iter/append, 100 uc 345 910 682 590 1932 296 STR reverse iter/append, 400 c 1324 3536 2665 2304 11000 297 STR reverse iter/append, 400 uc 1326 3557 2692 2308 11031 298 STR reverse iter/set, 10 c 54 79 68 57 207 299 STR reverse iter/set, 10 uc 53 81 68 55 213 300 STR reverse iter/set, 100 c 435 672 578 469 2090 301 STR reverse iter/set, 100 uc 442 662 578 468 2087 302 STR reverse iter/set, 400 c 1884 2736 2442 1999 13093 303 STR reverse iter/set, 400 uc 1921 2763 2490 2006 13090 304 STR reverse recursive, 10 c 123 171 152 117 360 305 STR reverse recursive, 10 uc 108 171 149 117 356 306 STR reverse recursive, 100 c 1175 1667 1510 1146 3711 307 STR reverse recursive, 100 uc 1077 2103 1930 1152 3702 308 STR reverse recursive, 400 c 5093 7201 6491 5016 8.0+ 309 STR reverse recursive, 400 uc 5687 15362 14672 5021 8.0+ 310 STR split iter, 4000 uchars 6217 8811 8784 7386 14490 311 STR split iter, 4010 chars 6148 8783 8711 7376 14429 312 STR split, 4000 uchars 1345 4145 4067 3122 1081 313 STR split, 4010 chars 1282 4098 3995 3111 1031 314 STR str $a eq $b 11 17 16 14 53 315 STR str $a eq $b (same obj) 10 17 16 14 53 316 STR str $a equal "" 7 11 12 8 67 317 STR str $a ne $b 11 16 16 14 51 318 STR str $a ne $b (same obj) 10 16 15 17 51 319 STR str num == "" 8 7 9 8 68 320 STR string compare 12 16 16 14 28 321 STR string compare "" 9 11 12 11 48 322 STR string compare long 239 194 197 196 950 323 STR string compare mixed long 562 210 208 203 952 324 STR string compare uni long 234 223 224 191 937 325 STR string equal "" 8 11 12 11 42 326 STR/LIST length, obj shimmer 1181 1187 1162 8 655 327 SWITCH 1st true 17 18 21 13 45 328 SWITCH 2nd true 18 22 16 14 46 329 SWITCH 9th true 20 22 18 16 49 330 SWITCH default true 23 22 19 17 47 331 TRACE all set (rwu) 16 17 14 13 22 332 TRACE no trace set 16 17 14 13 22 333 TRACE read 16 22 14 13 22 334 TRACE unset 16 17 14 18 22 335 TRACE write 16 17 14 15 22 336 UNSET catch var !exist 43 37 33 29 22 337 UNSET catch var exists 5 6 5 5 12 338 UNSET info check var !exist 6 6 6 5 14 339 UNSET info check var exists 8 8 7 7 14 340 UNSET nocomplain var !exist 5 38 33 29 26 341 UNSET nocomplain var exists 5 6 5 5 14 342 UNSET var exists 5 5 5 4 7 343 VAR 'array set' of 100 elems 169 151 155 131 247 344 VAR 100 'set's in array 86 80 82 79 248 345 VAR access global 16 19 16 13 20 346 VAR access local proc arg 5 5 5 5 18 347 VAR access locally set 5 5 6 5 17 348 VAR access upvar 19 20 17 14 22 349 VAR set array element 7 8 6 7 9 350 VAR set scalar 3 3 3 3 8 351 WORDCOUNT wc1 3073 3108 3149 1192 2002 352 WORDCOUNT wc2 769 1754 1760 692 1048 353 WORDCOUNT wc3 676 1660 1643 604 756 353 BENCHMARKS 1:8.4a3 2:8.3.1 3:8.2.3 4:8.0.5 5:7.6p2 FINISHED 2001-06-01 05:53:03 ---- [Kevin Kenny]: For those that insist on a single figure of merit, I took these numbers, normalized them to a scale of 8.4a3 == 1.0, and then took the harmonic mean of all benchmarks. ---- Version Relative Speed Comments ---- 7.6p2 0.125 The last version without bytecode compilation ---- 8.0.5 0.736 Bytecode compilation initially sped things up by a factor of about 6. ---- 8.2.3 0.600 The cost of internationalization was that things got about 20% slower. ---- 8.3.1 0.606 Not much change here.... ---- 8.4a3 1.000 The reference against which the others were measured. Many more operations are bytecoded, which gains about 50% in speed. ---- As with all benchmarks, take these numbers with a spoonful of salt!