First of all, I very much thank all of you who responded to my query.  I've
read all of your useful and helpful replies, but I am only responding to
this final one, so as to minimize bandwidth.


"Robert Klemme" <bob.news / gmx.net> writes:

> [ ... ]
>
> require 'benchmark'
> include Benchmark
>
> str = "Hammer and tongs"
>
> bm(7) do |x|
>   x.report("1") { 100000.times { str.reverse.split(//).each { |ch|
> ch } } }
>   x.report("2") { 100000.times { str.reverse.split('').each { |ch|
> ch } } }
>   x.report("3") { 100000.times { str.reverse.each_byte { |ch| ch.chr } } }
>   x.report("4") { 100000.times { (str.length-1).downto(0) {|idx| ch =
> str[idx]} } }
>   x.report("5") { 100000.times { len = str.size; for idx in 1..len ; ch =
> str[len-idx] end } }
> end
>              user     system      total        real
> 1        6.828000   0.000000   6.828000 (  6.907000)
> 2        6.891000   0.000000   6.891000 (  6.936000)
> 3        5.078000   0.000000   5.078000 (  5.098000)
> 4        2.281000   0.000000   2.281000 (  2.287000)
> 5        3.391000   0.000000   3.391000 (  3.395000)


I have been so steeped in Ruby-ish thinking that I had completely
forgotten about array indexing.  Duh!

And being so reminded, at first I would not have suspected that the
algorithms based on indexing would be faster than the others.  But I
suspect that the absence of 'reverse' is what accounts for the speed
differences.

By the way, I tried this with longer strings: between 40 and 8192 bytes,
which are the most likely lengths for the strings I will be dealing
with.  As the lengths increase beyond something like 50-60 bytes,
algorithm number 5 becomes faster than algorithm 4, and the difference
in speeds keeps increasing with longer strings.

But if I replace "ch.chr" in algorithm 3 and with just "ch" by itself,
that algorithm suddenly becomes the fastest.  The state machine to which
I want to feed the characters can deal with integer representations as
easily as their character equivalents.  So, it looks like the following
would be the fastest for my purposes:

  string.reverse.each_byte {
    |c|
    feedToMyStateMachine(c)
  }

Thanks again to all of you!


-- 
 Lloyd Zusman
 ljz / asfast.com
 God bless you.