require 'benchmark' include Benchmark class Weeble attr_reader :name, :age, :salary, :language def initialize(name, age, salary, language) @name, @age, @salary, @language = name, age, salary, language end def sorter [@age || 0, @salary || 0, @language || "", @name || ""] end end weebles = [ Weeble.new("Aaron", 24, 60_000, "perl"), Weeble.new("Bob", 24, 60_000, "python"), Weeble.new("Carl", 24, 80_000, "ruby"), Weeble.new("David", 24, 80_000, "ruby"), Weeble.new("Edward", 24, 90_000, "ruby"), Weeble.new("Frank", 33, 60_000, "perl"), Weeble.new("Greg", 33, 60_000, "python"), Weeble.new("Hecor", 33, 80_000, "ruby"), Weeble.new("Ivan", 33, 80_000, "ruby"), Weeble.new("Josh", 33, 90_000, "ruby"), Weeble.new("Kevin", 24, 60_000, "perl"), Weeble.new("Lewis", 24, 60_000, "python"), Weeble.new("Mike", 24, 80_000, "ruby"), Weeble.new("Noah", 24, 80_000, "ruby"), Weeble.new("Oscar", 24, 90_000, "ruby"), Weeble.new("Paul", 33, 60_000, "perl"), Weeble.new("Quentin", 33, 60_000, "python"), Weeble.new("Ryan", 33, 80_000, "ruby"), Weeble.new("Steve", 33, 80_000, "ruby"), Weeble.new("Titus", 33, 90_000, "ruby"), Weeble.new("Aaron", 24, 42_000, "perl"), Weeble.new("Bob", 24, 42_000, "python"), Weeble.new("Carl", 24, 42_000, "ruby"), Weeble.new("David", 24, 42_000, "ruby"), Weeble.new("Edward", 24, 42_000, "ruby"), Weeble.new("Frank", 33, 42_000, "perl"), Weeble.new("Greg", 33, 42_000, "python"), Weeble.new("Hecor", 33, 42_000, "ruby"), Weeble.new("Ivan", 33, 42_000, "ruby"), Weeble.new("Josh", 33, 42_000, "ruby"), Weeble.new("Kevin", 24, 42_000, "perl"), Weeble.new("Lewis", 24, 42_000, "python"), Weeble.new("Mike", 24, 42_000, "ruby"), Weeble.new("Noah", 24, 42_000, "ruby"), Weeble.new("Oscar", 24, 42_000, "ruby"), Weeble.new("Paul", 33, 42_000, "perl"), Weeble.new("Quentin", 33, 42_000, "python"), Weeble.new("Ryan", 33, 42_000, "ruby"), Weeble.new("Steve", 33, 42_000, "ruby"), Weeble.new("Titus", 33, 42_000, "ruby"), Weeble.new("Aaron", 27, 60_000, "perl"), Weeble.new("Bob", 27, 60_000, "python"), Weeble.new("Carl", 27, 80_000, "ruby"), Weeble.new("David", 27, 80_000, "ruby"), Weeble.new("Edward", 27, 90_000, "ruby"), Weeble.new("Frank", 27, 60_000, "perl"), Weeble.new("Greg", 21, 60_000, "python"), Weeble.new("Hecor", 21, 80_000, "ruby"), Weeble.new("Ivan", 21, 80_000, "ruby"), Weeble.new("Josh", 21, 90_000, "ruby"), Weeble.new("Kevin", 21, 60_000, "perl"), Weeble.new("Lewis", 21, 60_000, "python"), Weeble.new("Mike", 21, 80_000, "ruby"), Weeble.new("Noah", 21, 80_000, "ruby"), Weeble.new("Oscar", 27, 90_000, "ruby"), Weeble.new("Paul", 27, 60_000, "perl"), Weeble.new("Quentin", 27, 60_000, "python"), Weeble.new("Ryan", 27, 80_000, "ruby"), Weeble.new("Steve", 27, 80_000, "ruby"), Weeble.new("Titus", 27, 90_000, "ruby") ] sort_block = Proc.new do |a,b| if 0 != (comp = ((a.age || 0) <=> (b.age || 0))) comp elsif 0 != (comp = ((a.salary || 0) <=> (b.salary || 0))) comp elsif 0 != (comp = ((a.language || "") <=> (b.language || ""))) comp else ((a.name || "") <=> (b.name || "")) end end bm(16) do |t| t.report("sort") { 10_000.times { weebles.sort { |a,b| a.sorter <=> b.sorter } } } t.report("sort_by") { 10_000.times { weebles.sort_by { |w| w.sorter } } } t.report("sort block") { 10_000.times { weebles.sort(&sort_block) } } end