Skip to content

Benchmark for SimpleReact

johnmcclean-aol edited this page Jul 30, 2015 · 22 revisions

Benchmark using sync operators in simple-react v0.84

These benchmarks, on a Mac Book pro shows raw performance / overhead of CompletableFuture task management & Stream creation, without (sync tests) and with (async tests) the overhead of resubmitting tasks to the ExecutorService.

  • Model Name: MacBook Pro
  • Processor Name: Intel Core i7
  • Processor Speed: 2.5 GHz
  • Number of Processors: 1
  • Total Number of Cores (physical) : 4
  • Memory: 16 GB

Throughput can be higher or lower depending on whether calls are all made asynchronously or synchronously on the same thread and how the work load is constructed. The number of operations were scaled upwards by increasing the number of chains and by increasing the amount of data flowing through to completion.

Test time taken for 480,000,000 map (sync) + 8 million supply operations

[8 Sequential LazyFuture Streams with 60 chained CompletableFutures and 1 million records each operating concurrently].

  • average response time 1453332575 nanos (1.45 secs or 0.68 per second).
  • Equivalent to 335,779,991 (335.8 million) operations per second (if no garbage collector overhead).
  • Short burst performance capacity.

Test time taken for 480,000,000 map (async) + 8 million supply operations

  • average response time 15010002962 nanos (15 secs or 0.067 per second).
  • Equivalent to 32,511,652 (32.5 million) operations per second (if no garbage collector overhead).
  • Short burst performance capacity.
  • An order of magnitude slower than the sync performance at the same volume

Test time taken for 100,000,000 map (sync) + 10 million supply operations

  • average response time 417446427 nanos (0.417446427 secs or 2.4 per second).
  • Equivalent to 263,506,866 (263.5 million) operations per second (if no garbage collector overhead).
  • Short burst performance capacity.

Test time taken for 100,000,000 map (async) + 10 million supply operations

  • average response time 46841291754 nanos (4.68 secs or 0.21 per second).
  • Equivalent to 23,483,553 (23.5 million) operations per second (if no garbage collector overhead).
  • Short burst performance capacity.
  • An order of magnitude slower than the sync performance at the same volume

Test time taken for 10,000,000 map (sync) + 1 million supply operations

  • average response time 77381074.2 nanos (0.0773810742 secs or 12.9 per second).
  • Equivalent to 142,153,622 (142 million) operations per second (if no garbage collector overhead).
  • Short burst performance capacity.

Test time taken for 10,000,000 map (async) + 1 million supply operations

  • average response time 933740055.3 nanos.
  • Equivalent to 11,780,580 (11.78 million) operations per second (if no garbage collector overhead).
  • Short burst performance capacity.
  • This is an order of magnitude than synchronous chaining on the same the executing thread.

Infinite streams count throughput (sync)

This benchmark will take into account impact of garbage collection due to object creation. No special garbage collector settings were used.

  • Max functions applied per second 👍 431,202,700 (431.2 million)
  • Min functions applied per second 👍 79,631,350 (79.6 million)
  • Avg functions applied per second 👍 137,353,809 (137.4 million)

(See the async benchmark below for impact of resubmission after each call).

Users can switch between sync (next task executed on completing thread) / async (next task resubmitted to task executor) execution via the sync() and async() operators (since v0.84 - expected release date 7 April 2015).

160895200 244944375 334322750 80170700 162339000 245307100 84680425 169427075 79695000 154736850 79791125 82663775 163609525 80296600 163676850 84358300 169515900 80967200 85906750 85197300 165717375 85997500 90071850 80427025 86157625 170040450 260851800 343009875 431202700 82807475 161687600 248474200 86414850 88685675 82317825 168694075 85677450 170073975 86073150 82681775 79631350 84501625 82729400 84151325 81771325 89549925 180017250 84175975 84288225 82398300 169320750 83124350 164761425 87031775 175024075 260632975 86038800 85143075 83612325 168765975 85529600 167350225 254173875

Machine used to run the benchmark:

  • Model Name: MacBook Pro
  • Model Identifier: MacBookPro9,1
  • Processor Name: Intel Core i7
  • Processor Speed: 2.6 GHz
  • Number of Processors: 1
  • Total Number of Cores: 4
  • L2 Cache (per Core): 256 KB
  • L3 Cache: 6 MB
  • Memory: 8 GB

Java version:

  • Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
  • Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

JVM settings

  • -Xms4g
  • -Xmx4g
  • -XX:MaxMetaspaceSize=256M
  • -server
  • Default Parallel GC is used
  • MinHeapFreeRatio = 40
  • MaxHeapFreeRatio = 70
  • MaxHeapSize = 4294967296 (4096.0MB)
  • NewSize = 1431306240 (1365.0MB)
  • MaxNewSize = 1431306240 (1365.0MB)
  • OldSize = 2863661056 (2731.0MB)
  • NewRatio = 2
  • SurvivorRatio = 8

Program settings:

  • 4 threads
  • 8 max active stream
  • 4 min active streams
  • Chain length 20

Infinite streams count throughput (async)

Each function past to / through a ForkJoinPool

Benchmark results:

Around 13 million functions applied per second

Sample output from the benchmark program:

  • 10895580
  • 13812420
  • 14028800
  • 13108380
  • 13802820
  • 13702560
  • 13821380
  • 13840820
  • 13760800
  • 13752180
  • 13748880
  • 13852600
  • 13814600
  • 13813820
  • 13679800
  • 13675800
  • 13806400
  • 13759620
  • 13809820
  • 13708400
  • 13769720
  • 13835100
  • 13876400
  • 13828600
  • 13832840
  • 13726060
  • 13836700
  • 13760600
  • 13776100
  • 13745700
  • 13702440
  • 13714220
  • 13697700
  • 13691620
  • 13674100
  • 13825460
  • 13681420
  • 13770980
  • 13879360
  • 8071400
  • 13798560
  • 13849180
  • 13864420
  • 13836860
  • 13774900
  • 13930800
  • 13800160
  • 13835880
  • 13796200
  • 13788880
  • 13725980
  • 13653260
  • 13864960
  • 13725280
  • 13586240
  • 13747080
  • 13760880
  • 13770240
  • 13737420
  • 13669680
  • 13818800
  • 13833920
  • 13682320
  • 13760880
  • 13745840
  • 13818380
  • 13739140
  • 13803000
  • 13982200
  • 13851200
  • 13787160
  • 13701860
  • 13645720
  • 13793760
  • 13678400
  • 13687560
  • 13885880
  • 13686880
  • 13780140
  • 13746200
  • 13697900
  • 13709800
  • 13728600
  • 13730120
  • 13849200
  • 13756360
  • 13724580
  • 14016120
  • 13814160
  • 13768600
  • 13784420
  • 13697280
  • 13759420
  • 13842600
  • 13708340
  • 13748260
  • 13808400
  • 13840060
  • 13754240
  • 13872800
  • 13842420
  • 13736460
  • 13815440
  • 13745300
  • 13725780
  • 13746880
  • 13773380
  • 13926800
  • 13634360
  • 13190620
  • 12721260
  • 12654400
  • 13029400
  • 12920000
  • 12885800
  • 13050640
  • 13404000
  • 12960620
  • 12806000
  • 12572620
  • 12954000
  • 12948400
  • 12947560
  • 13053440
  • 12949160
  • 13025400
  • 12910640
  • 12902580
  • 12585360
  • 12521500
  • 12734980
  • 12831540
  • 12896740
  • 12539860
  • 12518560
  • 12540120
  • 12721220
  • 12921200
  • 13135200
  • 12918500
  • 12726260
  • 12561400
  • 12525200
  • 12537780
  • 12856440
  • 12914740
  • 12884540
  • 12776600
  • 12566000
  • 12468280
  • 12626720
  • 12911620
  • 12901100
  • 12951800
  • 12763560
  • 12509840
  • 12626360
  • 12887000
  • 13001720
  • 12906400
  • 12836940
  • 12543460
  • 12497400
  • 12654780
  • 12908200
  • 12920200
  • 12807280
  • 12553320
  • 12570580
  • 12568000
  • 12768080
  • 13011460
  • 12938100
  • 12765800
Clone this wiki locally