Guest User

Untitled

a guest
Jan 19th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. require "benchmark/ips"
  2.  
  3. class A
  4. def x; raise "original method not overridden"; end
  5. def y; raise "original method not overridden"; end
  6. end
  7.  
  8. module AMod
  9. attr_accessor :x_val, :y_val
  10. def x; puts x_val end
  11. def y; puts y_val end
  12. end
  13.  
  14. module BMod
  15. attr_accessor :x_val, :y_val
  16. def x
  17. return super unless x_val
  18. puts x_val
  19. end
  20. def y
  21. return super unless y_val
  22. puts y_val
  23. end
  24. end
  25.  
  26. class B < A
  27. prepend BMod
  28. end
  29.  
  30. def include_module_at_runtime x_val, y_val
  31. a = A.new
  32. a.singleton_class.include AMod
  33. a.x_val = x_val
  34. a.y_val = y_val
  35. a.x
  36. a.y
  37. end
  38.  
  39. def set_instance_variables x_val, y_val
  40. a = B.new
  41. a.x_val = x_val
  42. a.y_val = y_val
  43. a.x
  44. a.y
  45. end
  46.  
  47. def define_module_at_runtime x_val, y_val
  48. mod = Module.new do
  49. define_method(:x) { puts x_val }
  50. define_method(:y) { puts y_val }
  51. end
  52. a = A.new
  53. a.singleton_class.include mod
  54. a.x
  55. a.y
  56. end
  57.  
  58. def define_methods_at_runtime x_val, y_val
  59. a = A.new
  60. a.define_singleton_method(:x) { puts x_val }
  61. a.define_singleton_method(:y) { puts y_val }
  62. a.x
  63. a.y
  64. end
  65.  
  66. Benchmark.ips do |x|
  67. %w[include_module_at_runtime set_instance_variables define_module_at_runtime
  68. define_methods_at_runtime].each do |method|
  69. x.report(method) do
  70. send method, 1, 2
  71. end
  72. end
  73. x.compare!
  74. end
  75.  
  76. # Comparison:
  77. # set_instance_variables: 78453.9 i/s
  78. # define_methods_at_runtime: 58676.1 i/s - 1.34x slower
  79. # include_module_at_runtime: 57551.2 i/s - 1.36x slower
  80. # define_module_at_runtime: 49288.7 i/s - 1.59x slower
Add Comment
Please, Sign In to add comment