File tree 2 files changed +58
-0
lines changed
2 files changed +58
-0
lines changed Original file line number Diff line number Diff line change @@ -133,6 +133,26 @@ Comparison:
133
133
module_eval with string: 1129.7 i/s - 1.19x slower
134
134
```
135
135
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
+
136
156
##### ` raise ` vs ` E2MM#Raise ` for raising (and defining) exeptions [ code] ( code/general/raise-vs-e2mmap.rb )
137
157
138
158
Ruby'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
+
4
+ class AdvancedArray < SimpleDelegator
5
+ def initialize ( *args )
6
+ @args = args
7
+ self . __setobj__ ( @args )
8
+ end
9
+
10
+ def push ( value )
11
+ @args . push ( value )
12
+ end
13
+
14
+ extend Forwardable
15
+ def_delegator :@args , :push , :forwarded_push
16
+ end
17
+
18
+ def fast
19
+ array = AdvancedArray . new
20
+ array . push ( 1 ) # Simple method call
21
+ end
22
+
23
+ def slow
24
+ array = AdvancedArray . new
25
+ array . forwarded_push ( 1 ) # Forwarded method call
26
+ end
27
+
28
+ def slowest
29
+ array = AdvancedArray . new
30
+ array . pop ( 1 ) # Delegated method call
31
+ end
32
+
33
+ Benchmark . ips do |x |
34
+ x . report ( 'method' ) { fast }
35
+ x . report ( 'forwarded method' ) { slow }
36
+ x . report ( 'delegated method' ) { slowest }
37
+ x . compare!
38
+ end
You can’t perform that action at this time.
0 commit comments