Skip to content

Instantly share code, notes, and snippets.

@jodosha
Created June 13, 2009 10:37
Show Gist options
  • Save jodosha/129191 to your computer and use it in GitHub Desktop.
Save jodosha/129191 to your computer and use it in GitHub Desktop.
# Refactoring proposal for ActiveSupport bytes calculations
require "benchmark"
ONE = 1
module Bytes
def bytes
self
end
alias :byte :bytes
def kilobytes
self * 1024
end
alias :kilobyte :kilobytes
def megabytes
self * 1024.kilobytes
end
alias :megabyte :megabytes
def gigabytes
self * 1024.megabytes
end
alias :gigabyte :gigabytes
def terabytes
self * 1024.gigabytes
end
alias :terabyte :terabytes
def petabytes
self * 1024.terabytes
end
alias :petabyte :petabytes
def exabytes
self * 1024.petabytes
end
alias :exabyte :exabytes
end
module RefactoredBytes
KILOBYTE = 1024
MEGABYTE = KILOBYTE * 1024
GIGABYTE = MEGABYTE * 1024
TERABYTE = GIGABYTE * 1024
PETABYTE = TERABYTE * 1024
EXABYTE = PETABYTE * 1024
def refactored_bytes
self
end
alias :refactored_byte :refactored_bytes
def refactored_kilobytes
self * KILOBYTE
end
alias :refactored_kilobyte :refactored_kilobytes
def refactored_megabytes
self * MEGABYTE
end
alias :refactored_megabyte :refactored_megabytes
def refactored_gigabytes
self * GIGABYTE
end
alias :refactored_gigabyte :refactored_gigabytes
def refactored_terabytes
self * TERABYTE
end
alias :refactored_terabyte :refactored_terabytes
def refactored_petabytes
self * PETABYTE
end
alias :refactored_petabyte :refactored_petabytes
def refactored_exabytes
self * EXABYTE
end
alias :refactored_exabyte :refactored_exabytes
end
class Numeric
include Bytes, RefactoredBytes
end
Benchmark.bm(30) do |b|
# kilobyte
b.report("kilobyte") do
5_000_000.times { ONE.kilobyte }
end
b.report("refactored_kilobyte") do
5_000_000.times { ONE.refactored_kilobyte }
end
# megabyte
b.report("megabyte") do
5_000_000.times { ONE.megabyte }
end
b.report("refactored_megabyte") do
5_000_000.times { ONE.refactored_megabyte }
end
# gigabyte
b.report("gigabyte") do
5_000_000.times { ONE.gigabyte }
end
b.report("refactored_gigabyte") do
5_000_000.times { ONE.refactored_gigabyte }
end
# terabyte
b.report("terabyte") do
5_000_000.times { ONE.terabyte }
end
b.report("refactored_terabyte") do
5_000_000.times { ONE.refactored_terabyte }
end
# petabyte
b.report("petabyte") do
5_000_000.times { ONE.petabyte }
end
b.report("refactored_petabyte") do
5_000_000.times { ONE.refactored_petabyte }
end
# exabyte
b.report("exabyte") do
5_000_000.times { ONE.exabyte }
end
b.report("refactored_exabyte") do
5_000_000.times { ONE.refactored_exabyte }
end
end
__END__
                                    user     system      total        real
kilobyte                        2.450000   0.010000   2.460000 (  2.479556)
refactored_kilobyte             2.570000   0.010000   2.580000 (  2.583070)
megabyte                        4.360000   0.010000   4.370000 (  4.378750)
refactored_megabyte             2.570000   0.010000   2.580000 (  2.595025)
gigabyte                       16.590000   0.040000  16.630000 ( 16.678308)
refactored_gigabyte             8.580000   0.010000   8.590000 (  8.609626)
terabyte                       25.110000   0.060000  25.170000 ( 25.218141)
refactored_terabyte             8.630000   0.030000   8.660000 (  8.671909)
petabyte                       32.890000   0.100000  32.990000 ( 33.105326)
refactored_petabyte             8.650000   0.030000   8.680000 (  8.706800)
exabyte                        41.200000   0.120000  41.320000 ( 41.442681)
refactored_exabyte              8.660000   0.020000   8.680000 (  8.695625)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment