module PerformanceCheck
class << self
ITERATIONS = 2
def time_it
start_time = Time.now
yield
Time.now - start_time
end
def without_optimization
(1...1_000_000).select do |n|
n.to_s == n.to_s.reverse && n.to_s(2) == n.to_s(2).reverse
end.reduce(0, :+)
end
def with_optimization
(1...1_000_000).select do |n|
(base10 = n.to_s) == base10.reverse && (base2 = n.to_s(2)) == base2.reverse
end.reduce(0, :+)
end
def profile_optimization
result = without_optimization
duration = time_it do
ITERATIONS.times { without_optimization }
end
puts "Without optimization took #{duration/ITERATIONS}s per iteration to return #{result}"
result = with_optimization
duration = time_it do
ITERATIONS.times { with_optimization }
end
puts "With optimization took #{duration/ITERATIONS}s per iteration to return #{result}"
end
end
end
PerformanceCheck.profile_optimization
bW9kdWxlIFBlcmZvcm1hbmNlQ2hlY2sKICBjbGFzcyA8PCBzZWxmCiAgICBJVEVSQVRJT05TID0gMgoKICAgIGRlZiB0aW1lX2l0CiAgICAgIHN0YXJ0X3RpbWUgPSBUaW1lLm5vdwogICAgICB5aWVsZAogICAgICBUaW1lLm5vdyAtIHN0YXJ0X3RpbWUKICAgIGVuZAoKICAgIGRlZiB3aXRob3V0X29wdGltaXphdGlvbgogICAgICAoMS4uLjFfMDAwXzAwMCkuc2VsZWN0IGRvIHxufAogICAgICAgIG4udG9fcyA9PSBuLnRvX3MucmV2ZXJzZSAmJiBuLnRvX3MoMikgPT0gbi50b19zKDIpLnJldmVyc2UKICAgICAgZW5kLnJlZHVjZSgwLCA6KykKICAgIGVuZAoKICAgIGRlZiB3aXRoX29wdGltaXphdGlvbgogICAgICAoMS4uLjFfMDAwXzAwMCkuc2VsZWN0IGRvIHxufAogICAgICAgIChiYXNlMTAgPSBuLnRvX3MpID09IGJhc2UxMC5yZXZlcnNlICYmIChiYXNlMiA9IG4udG9fcygyKSkgPT0gYmFzZTIucmV2ZXJzZQogICAgICBlbmQucmVkdWNlKDAsIDorKQogICAgZW5kCgogICAgZGVmIHByb2ZpbGVfb3B0aW1pemF0aW9uCiAgICAgIHJlc3VsdCA9IHdpdGhvdXRfb3B0aW1pemF0aW9uCiAgICAgIGR1cmF0aW9uID0gdGltZV9pdCBkbwogICAgICAgIElURVJBVElPTlMudGltZXMgeyB3aXRob3V0X29wdGltaXphdGlvbiB9CiAgICAgIGVuZAogICAgICBwdXRzICJXaXRob3V0IG9wdGltaXphdGlvbiB0b29rICN7ZHVyYXRpb24vSVRFUkFUSU9OU31zIHBlciBpdGVyYXRpb24gdG8gcmV0dXJuICN7cmVzdWx0fSIKCiAgICAgIHJlc3VsdCA9IHdpdGhfb3B0aW1pemF0aW9uCiAgICAgIGR1cmF0aW9uID0gdGltZV9pdCBkbwogICAgICAgIElURVJBVElPTlMudGltZXMgeyB3aXRoX29wdGltaXphdGlvbiB9CiAgICAgIGVuZAogICAgICBwdXRzICJXaXRoIG9wdGltaXphdGlvbiB0b29rICN7ZHVyYXRpb24vSVRFUkFUSU9OU31zIHBlciBpdGVyYXRpb24gdG8gcmV0dXJuICN7cmVzdWx0fSIKCiAgICBlbmQKICBlbmQKZW5kCgpQZXJmb3JtYW5jZUNoZWNrLnByb2ZpbGVfb3B0aW1pemF0aW9u