This directory contains some examples illustrating techniques for extracting high-performance from flex scanners. Each program implements a simplified version of the Unix "wc" tool: read text from stdin and print the number of characters, words, and lines present in the text. All programs were compiled using gcc (version unavailable, sorry) with the -O flag, and run on a SPARCstation 1+. The input used was a PostScript file, mainly containing figures, with the following "wc" counts: lines words characters 214217 635954 2592172 The basic principles illustrated by these programs are: - match as much text with each rule as possible - adding rules does not slow you down! - avoid backing up and the big caveat that comes with them is: - you buy performance with decreased maintainability; make sure you really need it before applying the above techniques. See the "Performance Considerations" section of flexdoc for more details regarding these principles. The different versions of "wc": mywc.c a simple but fairly efficient C version wc1.l a naive flex "wc" implementation wc2.l somewhat faster; adds rules to match multiple tokens at once wc3.l faster still; adds more rules to match longer runs of tokens wc4.l fastest; still more rules added; hard to do much better using flex (or, I suspect, hand-coding) wc5.l identical to wc3.l except one rule has been slightly shortened, introducing backing-up Timing results (all times in user CPU seconds): program time notes ------- ---- ----- wc1 16.4 default flex table compression (= -Cem) wc1 6.7 -Cf compression option /bin/wc 5.8 Sun's standard "wc" tool mywc 4.6 simple but better C implementation! wc2 4.6 as good as C implementation; built using -Cf wc3 3.8 -Cf wc4 3.3 -Cf wc5 5.7 -Cf; ouch, backing up is expensive