...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Performance measurements were taken using std::chrono::highresolution_clock
,
with overhead corrections. The code was compiled using the build options: variant
= release, optimization = speed [7].
The columns labeled fiber (atomics) were compiled
with default fiber synchronization, capable of synchronizing fibers running
on different threads. The columns labeled fiber (raw)
were compiled with BOOST_FIBERS_NO_ATOMICS
.
Table 1.1. Overhead of join (contains fiber-context destruction, fiber-stack deallocation)
thread |
fiber (atomics) |
fiber (raw) |
tbb |
qthread |
---|---|---|---|---|
18 µs |
950 ns |
900 ns |
570 ns |
620 ns |
(from overhead_join.cpp)
(from overhead_detach.cpp)
(from overhead_yield.cpp)
(from overhead_future.cpp)
Table 1.5. Overhead of fiber creation (contains fiber-stack allocation and preparation, fiber-context construction, scheduler handling)
thread |
fiber (atomics) |
fiber (raw) |
---|---|---|
18 µs |
450 ns |
445 ns |
(from overhead_create.cpp)
Table 1.6. Scaling of creating and joining
average of |
thread |
fiber (atomics) |
fiber (raw) |
---|---|---|---|
10 |
8.21 µs |
1.96 µs |
1.85 µs |
50 |
6.67 µs |
1.40 µs |
1.27 µs |
100 |
6.79 µs |
1.84 µs |
1.81 µs |
500 |
8.25 µs |
1.13 µs |
1.10 µs |
1000 |
7.71 µs |
1.46 µs |
1.26 µs |
5000 |
5.67 µs |
2.11 µs |
1.90 µs |
10000 |
5.25 µs |
2.36 µs |
1.89 µs |
(from scale_join.cpp)
Numbers of the microbenchmark syknet from Alexander Temerev [8]:
Table 1.7. performance of N=100000 actors/goroutines/fibers
Haskell | stack-1.0.4 |
fiber (single threaded/raw) | gcc-5.2.1 |
fiber (single threaded/atomics) | gcc-5.2.1 |
Erlang | erts-7.0 |
Go | go1.4.2 |
---|---|---|---|---|
58ms - 108ms |
205ms - 263ms |
221ms - 278ms |
237ms- 470ms |
614ms - 883ms |