Skip to content

Commit 927a17d

Browse files
committed
Add comparison for method vs forwarded method vs delegated method
1 parent 38f49f9 commit 927a17d

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

README.md

+20
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,26 @@ Comparison:
133133
module_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

138158
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 numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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

0 commit comments

Comments
 (0)