# Parallel assignments vs. Serial assigments

**URL:** <https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496>\
**Category:** Ruby\
**Created:** [February 15, 2010, 5:25pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496 "2010-02-15T17:25:33Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gavin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/439d5e/32.png) [@gavin](https://www.ruby-forum.com/u/gavin)\
**Post date:** [February 15, 2010, 5:25pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496/1 "2010-02-15T17:25:33Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![gavin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/439d5e/32.png) [@gavin](https://www.ruby-forum.com/u/gavin)\
**Post date:** [February 15, 2010, 5:35pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496/2 "2010-02-15T17:35:30Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![gavin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/439d5e/32.png) [@gavin](https://www.ruby-forum.com/u/gavin)\
**Post date:** [February 15, 2010, 5:47pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496/3 "2010-02-15T17:47:47Z")

</div>

On Mon, Feb 15, 2010 at 5:30 PM, Gavin  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ```
> > 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?

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 = 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

class Three

def initialize(\*args)  
@first\_name, @last\_name = \*args  
end  
end

require “rubygems”  
require “benchmark”

GC.disable

puts “Arrays before serial: #{ObjectSpace.each\_object(Array){}}”  
10000.times { |n| var = One.new(“gavin#{n}”, “morrice”)}  
puts “Arrays after serial: #{ObjectSpace.each\_object(Array){}}”  
10000.times { |n| var = 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.

---

<div class="post-metadata">

**Author:** ![gavin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/439d5e/32.png) [@gavin](https://www.ruby-forum.com/u/gavin)\
**Post date:** [February 15, 2010, 5:51pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496/4 "2010-02-15T17:51:53Z")

</div>

2010/2/15 Jesús Gabriel y Galán [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> end  
> def initialize(\*args)  
> @first\_name, @last\_name = \*args  
> end  
> 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 = One.new(“gavin#{n}”, “morrice”)}  
puts “Arrays after serial: #{ObjectSpace.each\_object(Array){}}”  
10000.times { |n| var = Two.new(“gavin#{n}”, “morrice”)}  
puts “Arrays after parallel: #{ObjectSpace.each\_object(Array){}}”  
10000.times { |n| var = 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.

---

<div class="post-metadata">

**Author:** ![gavin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/439d5e/32.png) [@gavin](https://www.ruby-forum.com/u/gavin)\
**Post date:** [February 16, 2010, 7:19pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496/5 "2010-02-16T19:19:34Z")

</div>

On Tue, Feb 16, 2010 at 7:01 PM, Robert K.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> a, b = 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.

---

<div class="post-metadata">

**Author:** ![gavin](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/439d5e/32.png) [@gavin](https://www.ruby-forum.com/u/gavin)\
**Post date:** [February 16, 2010, 7:02pm UTC](https://www.ruby-forum.com/t/parallel-assignments-vs-serial-assigments/183496/6 "2010-02-16T19:02:00Z")

</div>

On 02/15/2010 05:50 PM, Jesús Gabriel y Galán wrote:

> 2010/2/15 Jesús Gabriel y Galán [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > I think it might be because the parallel assigment creates an array  
> > under the hood?

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
