From: Timothy Goddard Date: 2007-03-08T20:15:05+09:00 Subject: Re: Sorting objects... On Mar 8, 9:19 pm, "rretzbach" wrote: > On 8 Mrz., 08:09, "Farrel Lifson" wrote: > > > > > On 08/03/07, Justin Collins wrote: > > > > Farrel Lifson wrote: > > > > On 08/03/07, Jason Burgett wrote: > > > >> 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} > > > > 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- Zitierten Text ausblenden - > > > - Zitierten Text anzeigen - > > 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.