csc4 -O2 for-each.scm simple for-each loop over common.log (1799840 lines) Nursery size 128k Cache primed Chicken 4 SVN 14034 Plain Chicken 4: ./for-each 9.843 seconds elapsed 3.399 seconds in (major) GC 3 mutations 6 minor GCs 7657 major GCs ./for-each -:h6m 6.422 seconds elapsed 0.002 seconds in (major) GC 3 mutations 5753 minor GCs 4 major GCs real 0m6.440s user 0m5.788s sys 0m0.646s With my initial modifications to create a static 1k string buffer for read-line, unsafe: 7.306 seconds elapsed 1.461 seconds in (major) GC 3 mutations 15 minor GCs 3296 major GCs ./for-each -:h6m 5.839 seconds elapsed 0.001 seconds in (major) GC 3 mutations 1096 minor GCs 1 major GCs Without the static buffer applied, but changing getc to getc_unlocked: 7.068 seconds elapsed 3.438 seconds in (major) GC 3 mutations 6 minor GCs 7657 major GCs real 0m7.084s user 0m6.431s sys 0m0.648s ./for-each -:h6m 3.563 seconds elapsed 0.001 seconds in (major) GC 3 mutations 5753 minor GCs 4 major GCs ./for-each -:s1024k -:h8m 3.45 seconds elapsed 0 seconds in (major) GC 3 mutations 5580 minor GCs 0 major GCs real 0m3.468s user 0m2.914s sys 0m0.548s ./for-each -:h2m 3.55 seconds elapsed 0.009 seconds in (major) GC 3 mutations 1417 minor GCs 18 major GCs ./for-each -:hi2m 6.751 seconds elapsed 3.183 seconds in (major) GC 3 mutations 6 minor GCs 7181 major GCs With static buffer reapplied, and getc_unlocked: 4.528 seconds elapsed 1.42 seconds in (major) GC 3 mutations 15 minor GCs 3296 major GCs real 0m4.545s user 0m3.947s sys 0m0.593s ./for-each -:hi6m or -:h6m 3.063 seconds elapsed 0.002 seconds in (major) GC 3 mutations 1096 minor GCs 1 major GCs real 0m3.077s user 0m2.494s sys 0m0.580s ./for-each -:s1024k -:h8m 2.974 seconds elapsed 0 seconds in (major) GC 3 mutations 3465 minor GCs 0 major GCs real 0m2.989s user 0m2.453s sys 0m0.533s With correct static buffer, and get_unlocked: 4.489 seconds elapsed 1.54 seconds in (major) GC 4 mutations 6 minor GCs 3401 major GCs ./for-each -:h6m 2.978 seconds elapsed 0.001 seconds in (major) GC 4 mutations 1160 minor GCs 1 major GCs ./for-each -:h6m 2.887 seconds elapsed 0 seconds in (major) GC 4 mutations 3465 minor GCs 0 major GCs ./for-each -:h1m 2.992 seconds elapsed 0.011 seconds in (major) GC 4 mutations 1482 minor GCs 17 major GCs -------------------------------------------------------- Read all chars (400M calls) -- getc patch applied ./read-char 100.609 seconds elapsed 0.246 seconds in (major) GC 0 mutations 2312 minor GCs 657 major GCs real 1m40.673s user 1m32.302s sys 0m8.316s Read all chars (400M calls) -- getc patch not applied -- only 10% difference 111.68 seconds elapsed 0.273 seconds in (major) GC 0 mutations 2312 minor GCs 657 major GCs real 1m51.767s user 1m43.315s sys 0m8.376s -------------------------------------------------------- Linux abbey (VM, disk-bound), pre-patch ./for-each 13.43 seconds elapsed 2.03 seconds in (major) GC 3 mutations 68 minor GCs 1157 major GCs real 0m20.308s user 0m11.850s sys 0m1.590s ./for-each -:h4m 9.35 seconds elapsed 0.01 seconds in (major) GC 3 mutations 555 minor GCs 4 major GCs real 0m23.415s user 0m8.490s sys 0m0.860s Linux abbey (probably disk-bound), post-patch ./for-each 9.65 seconds elapsed 2.18 seconds in (major) GC 4 mutations 66 minor GCs 1163 major GCs real 0m18.844suser 0m8.020ssys 0m1.650s ./for-each -:h4m 5.56 seconds elapsed 0 seconds in (major) GC 4 mutations 12021 minor GCs 0 major GCs real 0m13.157s user 0m4.820s sys 0m0.740s