Skip to content

Instantly share code, notes, and snippets.

@kbrock
Created April 21, 2016 00:51
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 kbrock/edd05b8e4b463eda07082e2efa33e6f2 to your computer and use it in GitHub Desktop.
Save kbrock/edd05b8e4b463eda07082e2efa33e6f2 to your computer and use it in GitHub Desktop.
Eval vs defined? for a class
require 'benchmark/ips'
def eval_eval_true
name = "Benchmark"
eval("defined?(#{name}) && #{name}.class").to_s.eql?('Module')
end
def eval_eval_false
name = "XABCDE"
eval("defined?(#{name}) && #{name}.class").to_s.eql?('Module')
end
def eval_raise_true
name = "Benchmark"
eval(name + ".class").to_s.eql?('Module')
rescue NameError
false
end
def eval_raise_false
name = "XABCDE"
eval(name + ".class").to_s.eql?('Module')
rescue NameError
false
end
def def_eval_true
name = "Benchmark"
defined?(Benchmark) && eval(name + ".class").to_s.eql?('Module')
end
def def_eval_true_interp
name = "Benchmark"
defined?(Benchmark) && eval("#{name}.class").to_s.eql?('Module')
end
def def_eval_false
name = "XABCDE"
defined?(XABCDE) && eval(name + ".class").to_s.eql?('Module')
end
def def_true
defined?(Benchmark) && Benchmark.class == Module
end
def def_false
defined?(XABCDE) && XABCDE.class == Module
end
def direct_raise_true
Benchmark.class == Module
rescue NameError
false
end
def direct_raise_false
XABCDE.class == Module
rescue NameError
false
end
def def_direct_true
defined?(Benchmark) && Benchmark.class == Module
end
def def_direct_false
defined?(XABCDE) && XABCDE.class == Module
end
# -----
# sanity checking
raise "NO" if !eval_eval_true
raise "NO" if !eval_raise_true
raise "NO" if !def_eval_true
raise "NO" if !def_eval_true_interp
raise "NO" if !direct_raise_true
raise "NO" if !def_direct_true
raise "NO" if !def_true
raise "NO" if eval_eval_false
raise "NO" if eval_eval_false
raise "NO" if def_eval_false
raise "NO" if eval_raise_false
raise "NO" if direct_raise_false
raise "NO" if def_direct_false
raise "NO" if def_false
Benchmark.ips do |x|
x.report("eval_eval_true") { eval_eval_true }
x.report("eval_raise_true") { eval_raise_true }
x.report("def_eval_true") { def_eval_true }
x.report("def_eval_true_i") { def_eval_true_interp }
x.report("direct_raise_true") { direct_raise_true }
x.report("def_direct_true") { def_direct_true }
x.report("def_true") { def_true }
x.compare!
end
Benchmark.ips do |x|
x.report("eval_eval_false") { eval_eval_false }
x.report("eval_raise_false") { eval_eval_false }
x.report("def_eval_false") { def_eval_false }
x.report("eval_raise_false") { eval_raise_false }
x.report("direct_raise_false") { direct_raise_false }
x.report("def_direct_false") { def_direct_false }
x.report("def_false") { def_false }
x.compare!
end
uby define-vs-eval.rb
Warming up --------------------------------------
eval_eval_true 13.706k i/100ms
eval_raise_true 17.766k i/100ms
def_eval_true 16.619k i/100ms
def_eval_true_i 17.423k i/100ms
direct_raise_true 270.068k i/100ms
def_direct_true 261.766k i/100ms
def_true 258.549k i/100ms
Calculating -------------------------------------
eval_eval_true 143.672k (± 4.7%) i/s - 726.418k in 5.067286s
eval_raise_true 190.764k (± 3.6%) i/s - 959.364k in 5.035629s
def_eval_true 189.151k (± 4.5%) i/s - 947.283k in 5.018542s
def_eval_true_i 186.567k (± 3.6%) i/s - 940.842k in 5.049468s
direct_raise_true 8.298M (± 5.4%) i/s - 41.590M in 5.028062s
def_direct_true 6.328M (± 5.3%) i/s - 31.674M in 5.020321s
def_true 6.376M (± 5.2%) i/s - 31.802M in 5.002057s
Comparison:
direct_raise_true: 8297936.9 i/s
def_true: 6376020.5 i/s - 1.30x slower
def_direct_true: 6327824.8 i/s - 1.31x slower
eval_raise_true: 190763.9 i/s - 43.50x slower
def_eval_true: 189151.1 i/s - 43.87x slower
def_eval_true_i: 186566.8 i/s - 44.48x slower
eval_eval_true: 143671.6 i/s - 57.76x slower
Warming up --------------------------------------
eval_eval_false 13.818k i/100ms
eval_raise_false 13.863k i/100ms
def_eval_false 249.870k i/100ms
eval_raise_false 3.854k i/100ms
direct_raise_false 55.493k i/100ms
def_direct_false 276.104k i/100ms
def_false 273.045k i/100ms
Calculating -------------------------------------
eval_eval_false 149.025k (± 4.6%) i/s - 746.172k in 5.017757s
eval_raise_false 148.935k (± 4.4%) i/s - 748.602k in 5.036183s
def_eval_false 6.071M (± 5.5%) i/s - 30.484M in 5.037580s
eval_raise_false 39.355k (± 4.2%) i/s - 196.554k in 5.003303s
direct_raise_false 666.719k (± 4.8%) i/s - 3.330M in 5.006008s
def_direct_false 7.565M (± 5.8%) i/s - 37.826M in 5.018291s
def_false 7.569M (± 6.2%) i/s - 37.953M in 5.034977s
Comparison:
def_false: 7569137.3 i/s
def_direct_false: 7565112.3 i/s - same-ish: difference falls within error
def_eval_false: 6070722.0 i/s - 1.25x slower
direct_raise_false: 666719.4 i/s - 11.35x slower
eval_eval_false: 149025.0 i/s - 50.79x slower
eval_raise_false: 39355.5 i/s - 192.33x slower
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment