From: Rick DeNatale Date: 2006-09-04T23:43:23+09:00 Subject: Re: Ordered contrast for String or Array On 9/4/06, Rick DeNatale wrote: > Well, I was surprised when I couldn't seem to find a standard String > method for splitting a String into an array of single character > strings. > > Thinking about it again, another way is > > string.scan /./ > > I haven't benchmarked the two though so I don't know which is faster. > I guess that's a task for the to-do list. It looks like unpack is a clear winner: rick@frodo:~/rubyscripts$ cat benchstringsplit.rb require 'benchmark' include Benchmark class String def to_chars_array_with_unpack unpack('a'*length) end def to_chars_array_with_scan scan /./ end end iterations = 100 str = "abcdefghijklmnopqrstuvwxyz" * 5 bmbm do | x | 5.times do x.report("unpack #{str.length} character string") do iterations.times do str.to_chars_array_with_unpack end end x.report("scan #{str.length} character string") do iterations.times do str.to_chars_array_with_scan end end str += str end end rick@frodo:~/rubyscripts$ ruby benchstringsplit.rb Rehearsal ---------------------------------------------------------------- unpack 130 character string 1.130000 0.010000 1.140000 ( 1.139545) scan 130 character string 2.590000 0.000000 2.590000 ( 3.678513) unpack 260 character string 1.100000 0.000000 1.100000 ( 1.672301) scan 260 character string 2.170000 0.000000 2.170000 ( 2.850112) unpack 520 character string 1.000000 0.000000 1.000000 ( 1.808740) scan 520 character string 2.230000 0.010000 2.240000 ( 3.562964) unpack 1040 character string 1.080000 0.000000 1.080000 ( 2.122081) scan 1040 character string 2.260000 0.000000 2.260000 ( 3.962422) unpack 2080 character string 1.020000 0.000000 1.020000 ( 1.518132) scan 2080 character string 2.120000 0.000000 2.120000 ( 3.091133) ------------------------------------------------------ total: 16.720000sec user system total real unpack 130 character string 0.920000 0.000000 0.920000 ( 1.348387) scan 130 character string 2.200000 0.000000 2.200000 ( 5.322029) unpack 260 character string 0.990000 0.000000 0.990000 ( 1.363863) scan 260 character string 2.210000 0.020000 2.230000 ( 3.426876) unpack 520 character string 1.010000 0.000000 1.010000 ( 1.761541) scan 520 character string 2.140000 0.000000 2.140000 ( 2.251753) unpack 1040 character string 1.010000 0.000000 1.010000 ( 1.136075) scan 1040 character string 2.220000 0.000000 2.220000 ( 2.373706) unpack 2080 character string 1.000000 0.000000 1.000000 ( 1.083459) scan 2080 character string 2.130000 0.000000 2.130000 ( 2.199584) -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/