"Lloyd Zusman" <ljz@asfast.com> schrieb im Newsbeitrag
news:m3vfgq6hg6.fsf@asfast.com...
"Robert Klemme" <bob.news@gmx.net> writes:
> "Cameron McBride" <cameron.mcbride@gmail.com> schrieb im Newsbeitrag
> news:dcedf5e204071320562e0ad096@mail.gmail.com...
>> > What possible benefit is there to typing split(" ") vs.
split(/\s/)?
>> > One saved character (but two shift key presses!)?
>>
>> they are not the same:
>>
>> irb(main):001:0> s = "this is\tfun \tno?"
>> => ["this", "is", "fun", "no?"]
>> irb(main):003:0> s.split(" ")
>> => "this is\tfun \tno?"
>> irb(main):002:0> s.split(/\s/)
>> => ["this", "is", "fun", "", "no?"]
>
> I'd rather compare split(" ") to split(/\s+/), which is what I use
when I
> need this functionality. [ ... ]
However, the two cases are not equivalent:
irb(main):001:0> " spaces of doom ".split(/\s+/)
=> ["", "spaces", "of", "doom"]
irb(main):002:0> " spaces of doom ".split(" ")
=> ["spaces", "of", "doom"]
You'd have to compare split(" ") with strip.split(/\s+/). I'll do that
later this morning, when I have more time, and I'll then post my
results.
You're right, the strip makes
def test1(s) s.split ' ' end
def test2(s) s.split /\s+/ end
def test3(s) s.strip.split /\s+/ end
def test4(s) s.sub(/^\s+/, '').split /\s+/ end
foo = (1..100).to_a.join " "
1000.times { test1 foo }
1000.times { test2 foo }
1000.times { test3 foo }
1000.times { test4 foo }
12:26:30 [ruby]: ./split-perf.rb
% cumulative self self total
time seconds seconds calls ms/call ms/call name
56.61 1.36 1.36 4000 0.34 0.34 String#split
10.56 1.62 0.25 4 63.50 597.75 Integer#times
8.89 1.83 0.21 1000 0.21 0.21 String#sub
8.40 2.03 0.20 1000 0.20 0.55 Object#test2
7.15 2.20 0.17 1000 0.17 0.65 Object#test4
5.15 2.33 0.12 1000 0.12 0.39 Object#test1
2.62 2.39 0.06 1000 0.06 0.55 Object#test3
1.29 2.42 0.03 1 31.00 31.00
Profiler__.start_profile
0.00 2.42 0.00 1 0.00 2406.00 #toplevel
0.00 2.42 0.00 100 0.00 0.00 Fixnum#to_s
0.00 2.42 0.00 1000 0.00 0.00 String#strip
0.00 2.42 0.00 4 0.00 0.00 Module#method_added
0.00 2.42 0.00 1 0.00 0.00 Range#each
0.00 2.42 0.00 1 0.00 0.00 Array#join
0.00 2.42 0.00 1 0.00 0.00 Enumerable.to_a
def test1(s) s.split ' ' end
def test2(s) s.split /\s+/ end
def test3(s) s.strip.split /\s+/ end
def test4(s) s.sub(/^\s+/, '').split /\s+/ end
foo = " " + (1..100).to_a.join( " " )
1000.times { test1 foo }
1000.times { test2 foo }
1000.times { test3 foo }
1000.times { test4 foo }
12:27:36 [ruby]: ./split-perf.rb
% cumulative self self total
time seconds seconds calls ms/call ms/call name
51.03 1.26 1.26 4000 0.32 0.32 String#split
12.84 1.58 0.32 1000 0.32 0.65 Object#test3
10.13 1.83 0.25 4 62.50 613.50 Integer#times
8.30 2.03 0.20 1000 0.20 0.39 Object#test1
7.09 2.21 0.17 1000 0.17 0.64 Object#test4
6.97 2.38 0.17 1000 0.17 0.52 Object#test2
1.82 2.42 0.05 1000 0.05 0.05 String#sub
1.26 2.46 0.03 1 31.00 31.00
Profiler__.start_profile
1.22 2.49 0.03 1000 0.03 0.03 String#strip
0.61 2.50 0.01 1 15.00 15.00 Enumerable.to_a
0.00 2.50 0.00 1 0.00 0.00 String#+
0.00 2.50 0.00 100 0.00 0.00 Fixnum#to_s
0.00 2.50 0.00 1 0.00 2469.00 #toplevel
0.00 2.50 0.00 1 0.00 0.00 Range#each
0.00 2.50 0.00 1 0.00 0.00 Array#join
0.00 2.50 0.00 4 0.00 0.00 Module#method_added
Performance ranking depends on whether there are leading spaces or not.
robert