Skip to content

Instantly share code, notes, and snippets.

@joshsusser
Created August 17, 2008 17:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joshsusser/5812 to your computer and use it in GitHub Desktop.
Save joshsusser/5812 to your computer and use it in GitHub Desktop.
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment