Parallel assignments vs. Serial assigments

G

Gavin

Hey all

I was always under the impression that parallel assignments in Ruby
were faster than assigning variables individually.

Recently I was curious to see how much faster it was and decided to
test it:

class One

def initialize(first_name, last_name)
@first_name = first_name
@last_name = last_name
end

end

class Two

def initialize(first_name, last_name)
@first_name, @last_name = first_name, last_name
end

end
require "rubygems"
require "benchmark"

Benchmark.bmbm do |test|
test.report("serial") do
10000.times { |n| var = One.new("gavin#{n}", "morrice")}
end
test.report("parallel") do
10000.times { |n| var = Two.new("gavin#{n}", "morrice")}
end
end

The results I get show that it's slower (in both Ruby 1.8.7 and Ruby
1.9.1)

Can anyone elaborate?

Thanks
 
J

Jesús Gabriel y Galán

(My results show that parallel assignment is slower in this test)

I think it might be because the parallel assigment creates an array
under the hood?

class One

def initialize(first_name, last_name)
@first_name =3D first_name
@last_name =3D last_name
end

end

class Two

def initialize(first_name, last_name)
@first_name, @last_name =3D first_name, last_name
end
end

class Three

def initialize(*args)
@first_name, @last_name =3D *args
end
end


require "rubygems"
require "benchmark"

GC.disable

puts "Arrays before serial: #{ObjectSpace.each_object(Array){}}"
10000.times { |n| var =3D One.new("gavin#{n}", "morrice")}
puts "Arrays after serial: #{ObjectSpace.each_object(Array){}}"
10000.times { |n| var =3D Two.new("gavin#{n}", "morrice")}
puts "Arrays after parallel: #{ObjectSpace.each_object(Array){}}"

$ ruby test_parallel_assignment.rb
Arrays before serial: 3589
Arrays after serial: 3589
Arrays after parallel: 13589

Jesus.
 
J

Jesús Gabriel y Galán

2010/2/15 Jes=FAs Gabriel y Gal=E1n said:
I think it might be because the parallel assigment creates an array
under the hood?

class One

=A0def initialize(first_name, last_name)
=A0 @first_name =3D first_name
=A0 @last_name =A0=3D last_name
=A0end

end

class Two

=A0def initialize(first_name, last_name)
=A0 @first_name, @last_name =3D first_name, last_name
=A0end
end

class Three

=A0def initialize(*args)
=A0 @first_name, @last_name =3D *args
=A0end
end

I have a class Three cause I was also testing this other form, which
also creates arrays:

GC.disable
puts "Arrays before serial: #{ObjectSpace.each_object(Array){}}"
10000.times { |n| var =3D One.new("gavin#{n}", "morrice")}
puts "Arrays after serial: #{ObjectSpace.each_object(Array){}}"
10000.times { |n| var =3D Two.new("gavin#{n}", "morrice")}
puts "Arrays after parallel: #{ObjectSpace.each_object(Array){}}"
10000.times { |n| var =3D Three.new("gavin#{n}", "morrice")}
puts "Arrays after parallel with array: #{ObjectSpace.each_object(Array){}}=
"

$ ruby test_parallel_assignment.rb
Arrays before serial: 3589
Arrays after serial: 3589
Arrays after parallel: 13589
Arrays after parallel with array: 23589

Jesus.
 
R

Robert Klemme

However it is done technically, parallel assignment needs more space
because it has to evaluate *all* right hand sides before doing any
assignments. Otherwise swapping would not be possible

a, b = b, a

So, yes, it's likely an Array under the hood but even if not the
parallel assignment of two variables needs to store two object
references while sequential assignments of an arbitrary number of
elements gets away with space for a single reference (if you need it at
all).

Kind regards

robert
 
J

Jesús Gabriel y Galán

However it is done technically, parallel assignment needs more space beca= use
it has to evaluate *all* right hand sides before doing any assignments.
=A0Otherwise swapping would not be possible

a, b =3D b, a

Good point.
So, yes, it's likely an Array under the hood

Yep, that was my thought and that's why I checked with ObjectSpace,
that indeed shows Arrays being created.
It was easier for me than checking the implementation :).

Jesus.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,754
Messages
2,569,528
Members
45,000
Latest member
MurrayKeync

Latest Threads

Top