Skip to content

Commit 1a5e3f5

Browse files
committed
Experimenting with different Async internals.
1 parent 26b7a77 commit 1a5e3f5

File tree

4 files changed

+739
-41
lines changed

4 files changed

+739
-41
lines changed

examples/benchmark_async.rb

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ def foo(latch = nil)
2222
end
2323
end
2424

25+
class AsyncAlternateClass
26+
include Concurrent::Async
27+
def foo(latch = nil)
28+
latch.count_down if latch
29+
end
30+
end
31+
2532
IPS_NUM = 100
2633
BMBM_NUM = 100_000
2734

@@ -34,7 +41,14 @@ def foo(latch = nil)
3441
end
3542

3643
async = AsyncClass.new
37-
bm.report('async') do
44+
bm.report('async, thread per object') do
45+
latch = Concurrent::CountDownLatch.new(IPS_NUM)
46+
IPS_NUM.times { async.async.foo(latch) }
47+
latch.wait
48+
end
49+
50+
async = AsyncAlternateClass.new
51+
bm.report('async, global thread pool') do
3852
latch = Concurrent::CountDownLatch.new(IPS_NUM)
3953
IPS_NUM.times { async.async.foo(latch) }
4054
latch.wait
@@ -52,7 +66,14 @@ def foo(latch = nil)
5266
end
5367

5468
async = AsyncClass.new
55-
bm.report('async') do
69+
bm.report('async, thread per object') do
70+
latch = Concurrent::CountDownLatch.new(BMBM_NUM)
71+
BMBM_NUM.times { async.async.foo(latch) }
72+
latch.wait
73+
end
74+
75+
async = AsyncAlternateClass.new
76+
bm.report('async, global thread pool') do
5677
latch = Concurrent::CountDownLatch.new(BMBM_NUM)
5778
BMBM_NUM.times { async.async.foo(latch) }
5879
latch.wait
@@ -82,45 +103,30 @@ def foo(latch = nil)
82103
===========================================================
83104

84105
Calculating -------------------------------------
85-
celluloid 26.000 i/100ms
86-
async 47.000 i/100ms
87-
-------------------------------------------------
88-
celluloid 279.912 (± 6.1%) i/s - 1.404k
89-
async 478.932 (± 2.1%) i/s - 2.397k
90-
91-
Comparison:
92-
async: 478.9 i/s
93-
celluloid: 279.9 i/s - 1.71x slower
94-
95-
Rehearsal ---------------------------------------------
96-
celluloid 4.080000 0.620000 4.700000 ( 4.695271)
97-
async 2.280000 0.100000 2.380000 ( 2.345327)
98-
------------------------------------ total: 7.080000sec
99-
100-
user system total real
101-
celluloid 3.910000 0.580000 4.490000 ( 4.503884)
102-
async 2.220000 0.190000 2.410000 ( 2.340467)
103-
104-
===========================================================
105-
jruby 1.7.19 (1.9.3p551) 2015-01-29 20786bd on Java HotSpot(TM) 64-Bit Server VM 1.8.0_45-b14 +jit [darwin-x86_64]
106-
===========================================================
107-
108-
Calculating -------------------------------------
109-
celluloid 2.000 i/100ms
110-
async 32.000 i/100ms
106+
celluloid 24.000 i/100ms
107+
async, thread per object
108+
30.000 i/100ms
109+
async, global thread pool
110+
31.000 i/100ms
111111
-------------------------------------------------
112-
celluloid 72.887 (±26.1%) i/s - 334.000
113-
async 1.822k (±31.6%) i/s - 6.368k
112+
celluloid 242.345 (±10.7%) i/s - 1.200k
113+
async, thread per object
114+
316.387 (± 2.5%) i/s - 1.590k
115+
async, global thread pool
116+
318.200 (± 1.6%) i/s - 1.612k
114117

115118
Comparison:
116-
async: 1821.9 i/s
117-
celluloid: 72.9 i/s - 25.00x slower
118-
119-
Rehearsal ---------------------------------------------
120-
celluloid 8.890000 1.700000 10.590000 ( 5.930000)
121-
async 2.250000 0.150000 2.400000 ( 1.283000)
122-
----------------------------------- total: 12.990000sec
123-
124-
user system total real
125-
celluloid 6.310000 1.530000 7.840000 ( 5.817000)
126-
async 1.590000 0.060000 1.650000 ( 0.912000)
119+
async, global thread pool: 318.2 i/s
120+
async, thread per object: 316.4 i/s - 1.01x slower
121+
celluloid: 242.3 i/s - 1.31x slower
122+
123+
Rehearsal -------------------------------------------------------------
124+
celluloid 4.170000 0.630000 4.800000 ( 4.812120)
125+
async, thread per object 3.400000 0.110000 3.510000 ( 3.452749)
126+
async, global thread pool 3.410000 0.070000 3.480000 ( 3.455878)
127+
--------------------------------------------------- total: 11.790000sec
128+
129+
user system total real
130+
celluloid 4.080000 0.620000 4.700000 ( 4.687752)
131+
async, thread per object 3.380000 0.160000 3.540000 ( 3.469882)
132+
async, global thread pool 3.380000 0.050000 3.430000 ( 3.426759)

lib/concurrent.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
require 'concurrent/map'
1616
require 'concurrent/tuple'
1717
require 'concurrent/async'
18+
require 'concurrent/async_alternate'
1819
require 'concurrent/dataflow'
1920
require 'concurrent/delay'
2021
require 'concurrent/exchanger'

0 commit comments

Comments
 (0)