Created
April 21, 2016 00:51
-
-
Save kbrock/edd05b8e4b463eda07082e2efa33e6f2 to your computer and use it in GitHub Desktop.
Eval vs defined? for a class
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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