Skip to content

Commit 840486b

Browse files
committed
Add comparison for method vs forwarded method vs delegated method
1 parent 38f49f9 commit 840486b

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-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,39 @@
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

0 commit comments

Comments
 (0)