File tree Expand file tree Collapse file tree 2 files changed +59
-0
lines changed Expand file tree Collapse file tree 2 files changed +59
-0
lines changed Original file line number Diff line number Diff line change @@ -133,6 +133,26 @@ Comparison:
133133module_eval with string: 1129.7 i/s - 1.19x slower
134134```
135135
136+ ##### Method vs Forwarded method vs Delegated method [ code] ( code/general/method-vs-forwarded-method-vs-delegated-method.rb )
137+
138+ ```
139+ $ ruby -v code/general/method-vs-forwarded-method-vs-delegated-method.rb
140+ ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin19]
141+ Warming up --------------------------------------
142+ method 247.079k i/100ms
143+ forwarded method 183.323k i/100ms
144+ delegated method 136.666k i/100ms
145+ Calculating -------------------------------------
146+ method 2.481M (± 0.5%) i/s - 12.601M in 5.078755s
147+ forwarded method 1.830M (± 0.8%) i/s - 9.166M in 5.009606s
148+ delegated method 1.365M (± 0.6%) i/s - 6.833M in 5.006191s
149+
150+ Comparison:
151+ method: 2481182.0 i/s
152+ forwarded method: 1829835.8 i/s - 1.36x (± 0.00) slower
153+ delegated method: 1365026.7 i/s - 1.82x (± 0.00) slower
154+ ```
155+
136156##### ` raise ` vs ` E2MM#Raise ` for raising (and defining) exeptions [ code] ( code/general/raise-vs-e2mmap.rb )
137157
138158Ruby's [ Exception2MessageMapper module] ( http://ruby-doc.org/stdlib-2.2.0/libdoc/e2mmap/rdoc/index.html ) allows one to define and raise exceptions with predefined messages.
Original file line number Diff line number Diff line change 1+ require 'benchmark/ips'
2+ require 'forwardable'
3+ require 'delegate'
4+
5+ class AdvancedArray < SimpleDelegator
6+ def initialize ( *args )
7+ @args = args
8+ self . __setobj__ ( @args )
9+ end
10+
11+ def push ( value )
12+ @args . push ( value )
13+ end
14+
15+ extend Forwardable
16+ def_delegator :@args , :push , :forwarded_push
17+ end
18+
19+ def fast
20+ array = AdvancedArray . new
21+ array . push ( 1 ) # Simple method call
22+ end
23+
24+ def slow
25+ array = AdvancedArray . new
26+ array . forwarded_push ( 1 ) # Forwarded method call
27+ end
28+
29+ def slowest
30+ array = AdvancedArray . new
31+ array . pop ( 1 ) # Delegated method call
32+ end
33+
34+ Benchmark . ips do |x |
35+ x . report ( 'method' ) { fast }
36+ x . report ( 'forwarded method' ) { slow }
37+ x . report ( 'delegated method' ) { slowest }
38+ x . compare!
39+ end
You can’t perform that action at this time.
0 commit comments