Sorting objects...

J

Jason Burgett

I have a series of objects in an array. Each object corresponds to an
application and has several attributes. For instance I can call:

@application.name
@application.icon
@application.ranking

"ranking" is always an integer. So if I have an array of these objects,
say, @allApplications how do I sort using each application's ranking
(@application.ranking)?
 
F

Farrel Lifson

I have a series of objects in an array. Each object corresponds to an
application and has several attributes. For instance I can call:

@application.name
@application.icon
@application.ranking

"ranking" is always an integer. So if I have an array of these objects,
say, @allApplications how do I sort using each application's ranking
(@application.ranking)?

applications.sort_by{|object| object.ranking}
 
J

Justin Collins

Farrel said:
applications.sort_by{|object| object.ranking}

Another way would be to add a <=> method

class Application
def <=> other
self.ranking <=> other.ranking
end
end

-Justin
 
F

Farrel Lifson

Another way would be to add a <=> method

class Application
def <=> other
self.ranking <=> other.ranking
end
end

-Justin

Using only <=> does have some speed consequences:

require 'benchmark'
srand

class Application
attr_reader :ranking
def initialize
@ranking = rand
end
def <=>(other)
@ranking <=> other.ranking
end
end

applications = Array.new(1000000){Application.new}

Benchmark.bm do |bmark|
bmark.report("Sort") { applications.sort }
bmark.report("Sort By") {applications.sort_by {|o| o.ranking}}
end

C:\Documents and Settings\flifson\Desktop>ruby sort_test.rb
user system total real
Sort 20.782000 0.031000 20.813000 ( 20.844000)
Sort By 6.687000 0.000000 6.687000 ( 6.687000)

Farrel
 
R

rretzbach

Using only <=> does have some speed consequences:

require 'benchmark'
srand

class Application
attr_reader :ranking
def initialize
@ranking = rand
end
def <=>(other)
@ranking <=> other.ranking
end
end

applications = Array.new(1000000){Application.new}

Benchmark.bm do |bmark|
bmark.report("Sort") { applications.sort }
bmark.report("Sort By") {applications.sort_by {|o| o.ranking}}
end

C:\Documents and Settings\flifson\Desktop>ruby sort_test.rb
user system total real
Sort 20.782000 0.031000 20.813000 ( 20.844000)
Sort By 6.687000 0.000000 6.687000 ( 6.687000)

Farrel- Zitierten Text ausblenden -

- Zitierten Text anzeigen -

I don't understand, can someone please explain this loss of speed?
 
J

Justin Collins

rretzbach said:
I don't understand, can someone please explain this loss of speed?

I'm guessing it has to do with Enumerable#sort_by doing the key caching
thing?

-Justin
 
T

Timothy Goddard

I don't understand, can someone please explain this loss of speed?

Sorting compares pairs of objects many more times than the number of
objects actually being sorted. The <=> method extracts the ranking
from the objects each time a pair is compared. The sort_by method only
extracts the ranking from each object once then compares these. The
time difference represents the overhead of the <=> method call and the
time required to retrieve instance variables for each of the pair.
 

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

Forum statistics

Threads
474,236
Messages
2,571,185
Members
47,820
Latest member
HortenseKo

Latest Threads

Top