From 92a60692780414a60d57b5955d9dfd0b522624a9 Mon Sep 17 00:00:00 2001 From: Juan Pedro Moreno Date: Mon, 30 Oct 2017 16:07:05 +0100 Subject: [PATCH] Project Upgrade/Simplification (#12) * Upgrade project * Uses the auto-generated client instead of a custom one * Moves PersonServiceHandler moved to server implicits * Updates README to 20 iter and w-iter instead of 10 * Brings the new benchmark results based on 20 iterations * Upgrades radar chart * Removes Thread.sleep. It also: * Provides a new bar chart diagram. * Update all the benchmark results --- .gitignore | 3 + BENCHMARK_RESULTS.md | 1695 +++++++++++------ README.md | 71 +- bench/src/main/scala/RPCBenchmark.scala | 102 +- bench/src/main/scala/rpc/rpc.scala | 6 +- chart-bar.png | Bin 0 -> 33402 bytes chart-radar.png | Bin 0 -> 96506 bytes demo/src/main/scala/rpc/RPCDemoApp.scala | 48 +- demo/src/main/scala/rpc/package.scala | 5 +- .../src/main/scala/client/RPCClient.scala | 32 - .../main/scala/client/RPCClientHandler.scala | 54 - frees-rpc/src/main/scala/rpc.scala | 40 +- .../scala/server/PersonServiceHandler.scala | 28 - frees-rpc/src/main/scala/server/package.scala | 18 +- project/ProjectPlugin.scala | 2 +- project/build.properties | 2 +- radar-chart.png | Bin 40103 -> 0 bytes shared/src/main/scala/services.scala | 6 +- 18 files changed, 1200 insertions(+), 912 deletions(-) create mode 100644 chart-bar.png create mode 100644 chart-radar.png delete mode 100644 frees-rpc/src/main/scala/client/RPCClient.scala delete mode 100644 frees-rpc/src/main/scala/client/RPCClientHandler.scala delete mode 100644 frees-rpc/src/main/scala/server/PersonServiceHandler.scala delete mode 100644 radar-chart.png diff --git a/.gitignore b/.gitignore index ee31b15..afa20f1 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,7 @@ project/plugins/project/ /out/ .idea_modules/ +# Benchmark results +bench/*.txt + .DS_Store diff --git a/BENCHMARK_RESULTS.md b/BENCHMARK_RESULTS.md index 535de24..19d0343 100644 --- a/BENCHMARK_RESULTS.md +++ b/BENCHMARK_RESULTS.md @@ -17,617 +17,1070 @@ See [README](README.md#running-benchmarks) for reference. ## jmh - http ```bash -[info] Running (fork) org.openjdk.jmh.Main -i 10 -wi 10 -f 2 -t 1 metrifier.benchmark.HttpBenchmark -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.HttpBenchmark.createPerson -[info] # Run progress: 0.00% complete, ETA 00:03:20 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.135 ops/s -[info] # Warmup Iteration 2: 8.458 ops/s -[info] # Warmup Iteration 3: 8.824 ops/s -[info] # Warmup Iteration 4: 7.620 ops/s -[info] # Warmup Iteration 5: 8.978 ops/s -[info] # Warmup Iteration 6: 8.757 ops/s -[info] # Warmup Iteration 7: 9.042 ops/s -[info] # Warmup Iteration 8: 9.103 ops/s -[info] # Warmup Iteration 9: 9.018 ops/s -[info] # Warmup Iteration 10: 9.092 ops/s -[info] Iteration 1: 9.132 ops/s -[info] Iteration 2: 9.176 ops/s -[info] Iteration 3: 9.061 ops/s -[info] Iteration 4: 9.095 ops/s -[info] Iteration 5: 9.135 ops/s -[info] Iteration 6: 9.156 ops/s -[info] Iteration 7: 9.193 ops/s -[info] Iteration 8: 9.137 ops/s -[info] Iteration 9: 9.184 ops/s -[info] Iteration 10: 9.256 ops/s -[info] # Run progress: 10.00% complete, ETA 00:05:05 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.146 ops/s -[info] # Warmup Iteration 2: 8.756 ops/s -[info] # Warmup Iteration 3: 7.633 ops/s -[info] # Warmup Iteration 4: 8.979 ops/s -[info] # Warmup Iteration 5: 9.147 ops/s -[info] # Warmup Iteration 6: 9.064 ops/s -[info] # Warmup Iteration 7: 9.181 ops/s -[info] # Warmup Iteration 8: 9.161 ops/s -[info] # Warmup Iteration 9: 9.045 ops/s -[info] # Warmup Iteration 10: 9.168 ops/s -[info] Iteration 1: 9.174 ops/s -[info] Iteration 2: 9.169 ops/s -[info] Iteration 3: 9.255 ops/s -[info] Iteration 4: 9.147 ops/s -[info] Iteration 5: 9.120 ops/s -[info] Iteration 6: 9.271 ops/s -[info] Iteration 7: 9.213 ops/s -[info] Iteration 8: 9.269 ops/s -[info] Iteration 9: 9.220 ops/s -[info] Iteration 10: 9.205 ops/s -[info] Result "metrifier.benchmark.HttpBenchmark.createPerson": -[info] 9.178 ±(99.9%) 0.050 ops/s [Average] -[info] (min, avg, max) = (9.061, 9.178, 9.271), stdev = 0.058 -[info] CI (99.9%): [9.128, 9.229] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.HttpBenchmark.getPerson -[info] # Run progress: 20.00% complete, ETA 00:04:28 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.146 ops/s -[info] # Warmup Iteration 2: 219.184 ops/s -[info] # Warmup Iteration 3: 334.887 ops/s -[info] # Warmup Iteration 4: 354.014 ops/s -[info] # Warmup Iteration 5: 409.010 ops/s -[info] # Warmup Iteration 6: 473.887 ops/s -[info] # Warmup Iteration 7: 583.699 ops/s -[info] # Warmup Iteration 8: 693.049 ops/s -[info] # Warmup Iteration 9: 806.414 ops/s -[info] # Warmup Iteration 10: 991.595 ops/s -[info] Iteration 1: 856.217 ops/s -[info] Iteration 2: 1017.451 ops/s -[info] Iteration 3: 1178.473 ops/s -[info] Iteration 4: 1148.082 ops/s -[info] Iteration 5: 1320.677 ops/s -[info] Iteration 6: 1349.948 ops/s -[info] Iteration 7: 963.800 ops/s -[info] Iteration 8: 1232.866 ops/s -[info] Iteration 9: 1555.631 ops/s -[info] Iteration 10: 1687.265 ops/s -[info] # Run progress: 30.00% complete, ETA 00:03:51 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.150 ops/s -[info] # Warmup Iteration 2: 329.262 ops/s -[info] # Warmup Iteration 3: 475.157 ops/s -[info] # Warmup Iteration 4: 579.429 ops/s -[info] # Warmup Iteration 5: 730.202 ops/s -[info] # Warmup Iteration 6: 934.398 ops/s -[info] # Warmup Iteration 7: 1208.693 ops/s -[info] # Warmup Iteration 8: 1219.484 ops/s -[info] # Warmup Iteration 9: 1320.199 ops/s -[info] # Warmup Iteration 10: 1516.313 ops/s -[info] Iteration 1: 1579.863 ops/s -[info] Iteration 2: 1428.697 ops/s -[info] Iteration 3: 1378.384 ops/s -[info] Iteration 4: 1819.030 ops/s -[info] Iteration 5: 1836.729 ops/s -[info] Iteration 6: 2168.417 ops/s -[info] Iteration 7: 2163.157 ops/s -[info] Iteration 8: 2787.835 ops/s -[info] Iteration 9: 2983.657 ops/s -[info] Iteration 10: 3151.549 ops/s -[info] Result "metrifier.benchmark.HttpBenchmark.getPerson": -[info] 1680.386 ±(99.9%) 577.062 ops/s [Average] -[info] (min, avg, max) = (856.217, 1680.386, 3151.549), stdev = 664.546 -[info] CI (99.9%): [1103.324, 2257.449] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.HttpBenchmark.getPersonLinks -[info] # Run progress: 40.00% complete, ETA 00:03:15 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.145 ops/s -[info] # Warmup Iteration 2: 173.939 ops/s -[info] # Warmup Iteration 3: 386.565 ops/s -[info] # Warmup Iteration 4: 406.309 ops/s -[info] # Warmup Iteration 5: 516.973 ops/s -[info] # Warmup Iteration 6: 503.130 ops/s -[info] # Warmup Iteration 7: 736.516 ops/s -[info] # Warmup Iteration 8: 927.944 ops/s -[info] # Warmup Iteration 9: 884.460 ops/s -[info] # Warmup Iteration 10: 977.713 ops/s -[info] Iteration 1: 1146.142 ops/s -[info] Iteration 2: 1158.693 ops/s -[info] Iteration 3: 1212.162 ops/s -[info] Iteration 4: 1281.472 ops/s -[info] Iteration 5: 1062.814 ops/s -[info] Iteration 6: 1098.647 ops/s -[info] Iteration 7: 1323.317 ops/s -[info] Iteration 8: 1274.534 ops/s -[info] Iteration 9: 1461.539 ops/s -[info] Iteration 10: 1477.062 ops/s -[info] # Run progress: 50.00% complete, ETA 00:02:42 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.148 ops/s -[info] # Warmup Iteration 2: 277.126 ops/s -[info] # Warmup Iteration 3: 459.242 ops/s -[info] # Warmup Iteration 4: 570.147 ops/s -[info] # Warmup Iteration 5: 661.871 ops/s -[info] # Warmup Iteration 6: 872.458 ops/s -[info] # Warmup Iteration 7: 1136.678 ops/s -[info] # Warmup Iteration 8: 1123.677 ops/s -[info] # Warmup Iteration 9: 1249.813 ops/s -[info] # Warmup Iteration 10: 1210.197 ops/s -[info] Iteration 1: 1295.259 ops/s -[info] Iteration 2: 1305.222 ops/s -[info] Iteration 3: 1143.589 ops/s -[info] Iteration 4: 1343.722 ops/s -[info] Iteration 5: 1407.266 ops/s -[info] Iteration 6: 1451.507 ops/s -[info] Iteration 7: 1501.891 ops/s -[info] Iteration 8: 1550.315 ops/s -[info] Iteration 9: 1605.301 ops/s -[info] Iteration 10: 1892.867 ops/s -[info] Result "metrifier.benchmark.HttpBenchmark.getPersonLinks": -[info] 1349.666 ±(99.9%) 174.447 ops/s [Average] -[info] (min, avg, max) = (1062.814, 1349.666, 1892.867), stdev = 200.894 -[info] CI (99.9%): [1175.219, 1524.113] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.HttpBenchmark.listPersons -[info] # Run progress: 60.00% complete, ETA 00:02:09 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.147 ops/s -[info] # Warmup Iteration 2: 256.568 ops/s -[info] # Warmup Iteration 3: 409.377 ops/s -[info] # Warmup Iteration 4: 547.208 ops/s -[info] # Warmup Iteration 5: 638.751 ops/s -[info] # Warmup Iteration 6: 797.983 ops/s -[info] # Warmup Iteration 7: 1180.725 ops/s -[info] # Warmup Iteration 8: 1115.868 ops/s -[info] # Warmup Iteration 9: 1285.521 ops/s -[info] # Warmup Iteration 10: 1440.581 ops/s -[info] Iteration 1: 1498.751 ops/s -[info] Iteration 2: 1312.158 ops/s -[info] Iteration 3: 1302.480 ops/s -[info] Iteration 4: 1660.756 ops/s -[info] Iteration 5: 1654.316 ops/s -[info] Iteration 6: 1803.941 ops/s -[info] Iteration 7: 1714.078 ops/s -[info] Iteration 8: 2116.506 ops/s -[info] Iteration 9: 2447.021 ops/s -[info] Iteration 10: 2668.111 ops/s -[info] # Run progress: 70.00% complete, ETA 00:01:36 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.149 ops/s -[info] # Warmup Iteration 2: 299.459 ops/s -[info] # Warmup Iteration 3: 445.946 ops/s -[info] # Warmup Iteration 4: 575.267 ops/s -[info] # Warmup Iteration 5: 693.457 ops/s -[info] # Warmup Iteration 6: 924.626 ops/s -[info] # Warmup Iteration 7: 1246.228 ops/s -[info] # Warmup Iteration 8: 1148.598 ops/s -[info] # Warmup Iteration 9: 1353.673 ops/s -[info] # Warmup Iteration 10: 1533.637 ops/s -[info] Iteration 1: 1550.425 ops/s -[info] Iteration 2: 1128.220 ops/s -[info] Iteration 3: 1522.350 ops/s -[info] Iteration 4: 1513.943 ops/s -[info] Iteration 5: 1622.364 ops/s -[info] Iteration 6: 1601.407 ops/s -[info] Iteration 7: 1820.978 ops/s -[info] Iteration 8: 2071.804 ops/s -[info] Iteration 9: 2540.159 ops/s -[info] Iteration 10: 2682.227 ops/s -[info] Result "metrifier.benchmark.HttpBenchmark.listPersons": -[info] 1811.600 ±(99.9%) 400.316 ops/s [Average] -[info] (min, avg, max) = (1128.220, 1811.600, 2682.227), stdev = 461.005 -[info] CI (99.9%): [1411.284, 2211.916] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.HttpBenchmark.programComposition -[info] # Run progress: 80.00% complete, ETA 00:01:04 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.144 ops/s -[info] # Warmup Iteration 2: 7.200 ops/s -[info] # Warmup Iteration 3: 7.551 ops/s -[info] # Warmup Iteration 4: 7.937 ops/s -[info] # Warmup Iteration 5: 7.937 ops/s -[info] # Warmup Iteration 6: 7.920 ops/s -[info] # Warmup Iteration 7: 8.141 ops/s -[info] # Warmup Iteration 8: 8.317 ops/s -[info] # Warmup Iteration 9: 8.314 ops/s -[info] # Warmup Iteration 10: 8.401 ops/s -[info] Iteration 1: 8.430 ops/s -[info] Iteration 2: 8.321 ops/s -[info] Iteration 3: 8.318 ops/s -[info] Iteration 4: 8.360 ops/s -[info] Iteration 5: 8.445 ops/s -[info] Iteration 6: 8.481 ops/s -[info] Iteration 7: 8.511 ops/s -[info] Iteration 8: 8.537 ops/s -[info] Iteration 9: 8.548 ops/s -[info] Iteration 10: 8.616 ops/s -[info] # Run progress: 90.00% complete, ETA 00:00:32 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.144 ops/s -[info] # Warmup Iteration 2: 7.249 ops/s -[info] # Warmup Iteration 3: 7.670 ops/s -[info] # Warmup Iteration 4: 8.055 ops/s -[info] # Warmup Iteration 5: 8.061 ops/s -[info] # Warmup Iteration 6: 8.186 ops/s -[info] # Warmup Iteration 7: 8.213 ops/s -[info] # Warmup Iteration 8: 8.367 ops/s -[info] # Warmup Iteration 9: 8.340 ops/s -[info] # Warmup Iteration 10: 8.434 ops/s -[info] Iteration 1: 8.511 ops/s -[info] Iteration 2: 8.471 ops/s -[info] Iteration 3: 8.410 ops/s -[info] Iteration 4: 8.353 ops/s -[info] Iteration 5: 8.580 ops/s -[info] Iteration 6: 8.595 ops/s -[info] Iteration 7: 8.608 ops/s -[info] Iteration 8: 8.619 ops/s -[info] Iteration 9: 8.500 ops/s -[info] Iteration 10: 8.628 ops/s -[info] Result "metrifier.benchmark.HttpBenchmark.programComposition": -[info] 8.492 ±(99.9%) 0.089 ops/s [Average] -[info] (min, avg, max) = (8.318, 8.492, 8.628), stdev = 0.102 -[info] CI (99.9%): [8.404, 8.581] (assumes normal distribution) - -[info] # Run complete. Total time: 00:05:23 -[info] Benchmark Mode Cnt Score Error Units -[info] HttpBenchmark.createPerson thrpt 20 9.178 ± 0.050 ops/s -[info] HttpBenchmark.getPerson thrpt 20 1680.386 ± 577.062 ops/s -[info] HttpBenchmark.getPersonLinks thrpt 20 1349.666 ± 174.447 ops/s -[info] HttpBenchmark.listPersons thrpt 20 1811.600 ± 400.316 ops/s -[info] HttpBenchmark.programComposition thrpt 20 8.492 ± 0.089 ops/s +[info] Running (fork) org.openjdk.jmh.Main -o http-benchmark-results.txt -i 20 -wi 20 -f 2 -t 1 metrifier.benchmark.HttpBenchmark + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.HttpBenchmark.createPerson + +# Run progress: 0.00% complete, ETA 00:06:40 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.105 ops/s +# Warmup Iteration 2: 98.146 ops/s +# Warmup Iteration 3: 150.523 ops/s +# Warmup Iteration 4: 193.127 ops/s +# Warmup Iteration 5: 201.831 ops/s +# Warmup Iteration 6: 229.213 ops/s +# Warmup Iteration 7: 265.690 ops/s +# Warmup Iteration 8: 300.318 ops/s +# Warmup Iteration 9: 325.810 ops/s +# Warmup Iteration 10: 377.405 ops/s +# Warmup Iteration 11: 274.590 ops/s +# Warmup Iteration 12: 453.667 ops/s +# Warmup Iteration 13: 528.892 ops/s +# Warmup Iteration 14: 593.282 ops/s +# Warmup Iteration 15: 594.902 ops/s +# Warmup Iteration 16: 581.960 ops/s +# Warmup Iteration 17: 502.734 ops/s +# Warmup Iteration 18: 630.397 ops/s +# Warmup Iteration 19: 646.573 ops/s +# Warmup Iteration 20: 698.147 ops/s +Iteration 1: 716.770 ops/s +Iteration 2: 640.627 ops/s +Iteration 3: 710.789 ops/s +Iteration 4: 706.288 ops/s +Iteration 5: 621.900 ops/s +Iteration 6: 701.832 ops/s +Iteration 7: 799.806 ops/s +Iteration 8: 699.541 ops/s +Iteration 9: 691.254 ops/s +Iteration 10: 789.789 ops/s +Iteration 11: 791.610 ops/s +Iteration 12: 696.676 ops/s +Iteration 13: 774.205 ops/s +Iteration 14: 854.603 ops/s +Iteration 15: 776.280 ops/s +Iteration 16: 852.916 ops/s +Iteration 17: 927.439 ops/s +Iteration 18: 938.737 ops/s +Iteration 19: 836.584 ops/s +Iteration 20: 958.098 ops/s + +# Run progress: 10.00% complete, ETA 00:08:13 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.119 ops/s +# Warmup Iteration 2: 153.356 ops/s +# Warmup Iteration 3: 231.009 ops/s +# Warmup Iteration 4: 284.125 ops/s +# Warmup Iteration 5: 322.233 ops/s +# Warmup Iteration 6: 376.766 ops/s +# Warmup Iteration 7: 458.376 ops/s +# Warmup Iteration 8: 443.112 ops/s +# Warmup Iteration 9: 464.929 ops/s +# Warmup Iteration 10: 631.966 ops/s +# Warmup Iteration 11: 663.206 ops/s +# Warmup Iteration 12: 618.272 ops/s +# Warmup Iteration 13: 529.411 ops/s +# Warmup Iteration 14: 679.308 ops/s +# Warmup Iteration 15: 734.797 ops/s +# Warmup Iteration 16: 822.528 ops/s +# Warmup Iteration 17: 849.616 ops/s +# Warmup Iteration 18: 785.756 ops/s +# Warmup Iteration 19: 822.618 ops/s +# Warmup Iteration 20: 771.127 ops/s +Iteration 1: 661.743 ops/s +Iteration 2: 763.918 ops/s +Iteration 3: 844.760 ops/s +Iteration 4: 647.496 ops/s +Iteration 5: 688.848 ops/s +Iteration 6: 804.950 ops/s +Iteration 7: 832.085 ops/s +Iteration 8: 888.157 ops/s +Iteration 9: 859.227 ops/s +Iteration 10: 864.113 ops/s +Iteration 11: 869.696 ops/s +Iteration 12: 845.037 ops/s +Iteration 13: 858.420 ops/s +Iteration 14: 1082.050 ops/s +Iteration 15: 1176.946 ops/s +Iteration 16: 1186.448 ops/s +Iteration 17: 1276.276 ops/s +Iteration 18: 1306.230 ops/s +Iteration 19: 1232.384 ops/s +Iteration 20: 1267.566 ops/s + + +Result "metrifier.benchmark.HttpBenchmark.createPerson": + 861.052 ±(99.9%) 106.109 ops/s [Average] + (min, avg, max) = (621.900, 861.052, 1306.230), stdev = 188.609 + CI (99.9%): [754.943, 967.162] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.HttpBenchmark.getPerson + +# Run progress: 20.00% complete, ETA 00:07:14 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.136 ops/s +# Warmup Iteration 2: 166.049 ops/s +# Warmup Iteration 3: 266.763 ops/s +# Warmup Iteration 4: 318.418 ops/s +# Warmup Iteration 5: 347.499 ops/s +# Warmup Iteration 6: 461.348 ops/s +# Warmup Iteration 7: 494.589 ops/s +# Warmup Iteration 8: 606.455 ops/s +# Warmup Iteration 9: 694.390 ops/s +# Warmup Iteration 10: 910.898 ops/s +# Warmup Iteration 11: 876.455 ops/s +# Warmup Iteration 12: 803.516 ops/s +# Warmup Iteration 13: 1015.217 ops/s +# Warmup Iteration 14: 1073.062 ops/s +# Warmup Iteration 15: 1088.485 ops/s +# Warmup Iteration 16: 1116.181 ops/s +# Warmup Iteration 17: 960.667 ops/s +# Warmup Iteration 18: 1082.721 ops/s +# Warmup Iteration 19: 975.980 ops/s +# Warmup Iteration 20: 1081.493 ops/s +Iteration 1: 1153.774 ops/s +Iteration 2: 1158.449 ops/s +Iteration 3: 1263.525 ops/s +Iteration 4: 1244.730 ops/s +Iteration 5: 1440.425 ops/s +Iteration 6: 1465.721 ops/s +Iteration 7: 1483.527 ops/s +Iteration 8: 1596.471 ops/s +Iteration 9: 1846.494 ops/s +Iteration 10: 1779.183 ops/s +Iteration 11: 1580.581 ops/s +Iteration 12: 1243.928 ops/s +Iteration 13: 1752.277 ops/s +Iteration 14: 1775.425 ops/s +Iteration 15: 1847.345 ops/s +Iteration 16: 1935.540 ops/s +Iteration 17: 1833.612 ops/s +Iteration 18: 1579.313 ops/s +Iteration 19: 1955.545 ops/s +Iteration 20: 1970.927 ops/s + +# Run progress: 30.00% complete, ETA 00:06:16 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.136 ops/s +# Warmup Iteration 2: 220.112 ops/s +# Warmup Iteration 3: 355.817 ops/s +# Warmup Iteration 4: 388.559 ops/s +# Warmup Iteration 5: 433.302 ops/s +# Warmup Iteration 6: 533.506 ops/s +# Warmup Iteration 7: 613.867 ops/s +# Warmup Iteration 8: 772.323 ops/s +# Warmup Iteration 9: 954.274 ops/s +# Warmup Iteration 10: 928.452 ops/s +# Warmup Iteration 11: 816.781 ops/s +# Warmup Iteration 12: 908.460 ops/s +# Warmup Iteration 13: 848.713 ops/s +# Warmup Iteration 14: 1055.860 ops/s +# Warmup Iteration 15: 1067.474 ops/s +# Warmup Iteration 16: 956.918 ops/s +# Warmup Iteration 17: 975.666 ops/s +# Warmup Iteration 18: 1103.659 ops/s +# Warmup Iteration 19: 1029.149 ops/s +# Warmup Iteration 20: 1102.663 ops/s +Iteration 1: 1145.572 ops/s +Iteration 2: 1195.068 ops/s +Iteration 3: 1111.649 ops/s +Iteration 4: 1360.740 ops/s +Iteration 5: 1466.083 ops/s +Iteration 6: 1458.711 ops/s +Iteration 7: 1457.899 ops/s +Iteration 8: 1328.088 ops/s +Iteration 9: 1360.853 ops/s +Iteration 10: 1570.199 ops/s +Iteration 11: 1866.726 ops/s +Iteration 12: 1913.798 ops/s +Iteration 13: 1835.592 ops/s +Iteration 14: 1900.503 ops/s +Iteration 15: 1779.629 ops/s +Iteration 16: 1888.911 ops/s +Iteration 17: 1777.994 ops/s +Iteration 18: 1486.787 ops/s +Iteration 19: 1238.731 ops/s +Iteration 20: 1740.498 ops/s + + +Result "metrifier.benchmark.HttpBenchmark.getPerson": + 1569.770 ±(99.9%) 153.491 ops/s [Average] + (min, avg, max) = (1111.649, 1569.770, 1970.927), stdev = 272.830 + CI (99.9%): [1416.279, 1723.262] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.HttpBenchmark.getPersonLinks + +# Run progress: 40.00% complete, ETA 00:05:20 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.127 ops/s +# Warmup Iteration 2: 133.964 ops/s +# Warmup Iteration 3: 235.188 ops/s +# Warmup Iteration 4: 287.141 ops/s +# Warmup Iteration 5: 278.113 ops/s +# Warmup Iteration 6: 369.914 ops/s +# Warmup Iteration 7: 424.960 ops/s +# Warmup Iteration 8: 466.827 ops/s +# Warmup Iteration 9: 587.144 ops/s +# Warmup Iteration 10: 679.659 ops/s +# Warmup Iteration 11: 562.462 ops/s +# Warmup Iteration 12: 528.188 ops/s +# Warmup Iteration 13: 593.487 ops/s +# Warmup Iteration 14: 775.641 ops/s +# Warmup Iteration 15: 837.914 ops/s +# Warmup Iteration 16: 901.631 ops/s +# Warmup Iteration 17: 902.181 ops/s +# Warmup Iteration 18: 934.633 ops/s +# Warmup Iteration 19: 813.933 ops/s +# Warmup Iteration 20: 702.363 ops/s +Iteration 1: 839.118 ops/s +Iteration 2: 949.432 ops/s +Iteration 3: 971.930 ops/s +Iteration 4: 891.191 ops/s +Iteration 5: 888.035 ops/s +Iteration 6: 924.464 ops/s +Iteration 7: 984.107 ops/s +Iteration 8: 1002.553 ops/s +Iteration 9: 997.787 ops/s +Iteration 10: 1099.398 ops/s +Iteration 11: 1219.951 ops/s +Iteration 12: 1305.103 ops/s +Iteration 13: 1437.103 ops/s +Iteration 14: 1403.908 ops/s +Iteration 15: 1427.716 ops/s +Iteration 16: 1436.999 ops/s +Iteration 17: 1389.606 ops/s +Iteration 18: 1426.446 ops/s +Iteration 19: 1333.690 ops/s +Iteration 20: 1054.519 ops/s + +# Run progress: 50.00% complete, ETA 00:04:26 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.124 ops/s +# Warmup Iteration 2: 131.402 ops/s +# Warmup Iteration 3: 223.803 ops/s +# Warmup Iteration 4: 255.692 ops/s +# Warmup Iteration 5: 296.418 ops/s +# Warmup Iteration 6: 351.933 ops/s +# Warmup Iteration 7: 373.608 ops/s +# Warmup Iteration 8: 412.541 ops/s +# Warmup Iteration 9: 520.916 ops/s +# Warmup Iteration 10: 582.616 ops/s +# Warmup Iteration 11: 599.865 ops/s +# Warmup Iteration 12: 666.855 ops/s +# Warmup Iteration 13: 634.997 ops/s +# Warmup Iteration 14: 607.536 ops/s +# Warmup Iteration 15: 645.390 ops/s +# Warmup Iteration 16: 768.752 ops/s +# Warmup Iteration 17: 756.058 ops/s +# Warmup Iteration 18: 643.105 ops/s +# Warmup Iteration 19: 623.731 ops/s +# Warmup Iteration 20: 627.083 ops/s +Iteration 1: 634.046 ops/s +Iteration 2: 635.734 ops/s +Iteration 3: 702.738 ops/s +Iteration 4: 702.972 ops/s +Iteration 5: 771.164 ops/s +Iteration 6: 904.044 ops/s +Iteration 7: 882.728 ops/s +Iteration 8: 959.369 ops/s +Iteration 9: 997.529 ops/s +Iteration 10: 969.379 ops/s +Iteration 11: 1006.758 ops/s +Iteration 12: 1097.787 ops/s +Iteration 13: 1042.602 ops/s +Iteration 14: 1045.914 ops/s +Iteration 15: 1275.916 ops/s +Iteration 16: 1260.865 ops/s +Iteration 17: 1203.953 ops/s +Iteration 18: 1360.975 ops/s +Iteration 19: 1251.758 ops/s +Iteration 20: 1201.784 ops/s + + +Result "metrifier.benchmark.HttpBenchmark.getPersonLinks": + 1072.277 ±(99.9%) 131.565 ops/s [Average] + (min, avg, max) = (634.046, 1072.277, 1437.103), stdev = 233.857 + CI (99.9%): [940.712, 1203.842] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.HttpBenchmark.listPersons + +# Run progress: 60.00% complete, ETA 00:03:33 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.132 ops/s +# Warmup Iteration 2: 164.531 ops/s +# Warmup Iteration 3: 287.098 ops/s +# Warmup Iteration 4: 346.561 ops/s +# Warmup Iteration 5: 392.422 ops/s +# Warmup Iteration 6: 466.574 ops/s +# Warmup Iteration 7: 457.747 ops/s +# Warmup Iteration 8: 588.724 ops/s +# Warmup Iteration 9: 690.138 ops/s +# Warmup Iteration 10: 772.951 ops/s +# Warmup Iteration 11: 684.462 ops/s +# Warmup Iteration 12: 713.045 ops/s +# Warmup Iteration 13: 864.245 ops/s +# Warmup Iteration 14: 828.978 ops/s +# Warmup Iteration 15: 847.324 ops/s +# Warmup Iteration 16: 838.807 ops/s +# Warmup Iteration 17: 831.426 ops/s +# Warmup Iteration 18: 913.499 ops/s +# Warmup Iteration 19: 919.263 ops/s +# Warmup Iteration 20: 770.735 ops/s +Iteration 1: 788.506 ops/s +Iteration 2: 811.025 ops/s +Iteration 3: 902.517 ops/s +Iteration 4: 887.560 ops/s +Iteration 5: 947.753 ops/s +Iteration 6: 993.425 ops/s +Iteration 7: 899.379 ops/s +Iteration 8: 767.921 ops/s +Iteration 9: 1040.089 ops/s +Iteration 10: 1352.725 ops/s +Iteration 11: 1413.981 ops/s +Iteration 12: 1534.624 ops/s +Iteration 13: 1639.802 ops/s +Iteration 14: 1625.342 ops/s +Iteration 15: 1502.149 ops/s +Iteration 16: 1381.320 ops/s +Iteration 17: 1401.952 ops/s +Iteration 18: 1364.278 ops/s +Iteration 19: 1288.160 ops/s +Iteration 20: 1190.527 ops/s + +# Run progress: 70.00% complete, ETA 00:02:39 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.128 ops/s +# Warmup Iteration 2: 149.365 ops/s +# Warmup Iteration 3: 254.811 ops/s +# Warmup Iteration 4: 341.532 ops/s +# Warmup Iteration 5: 390.014 ops/s +# Warmup Iteration 6: 477.266 ops/s +# Warmup Iteration 7: 447.227 ops/s +# Warmup Iteration 8: 504.832 ops/s +# Warmup Iteration 9: 704.032 ops/s +# Warmup Iteration 10: 797.669 ops/s +# Warmup Iteration 11: 715.184 ops/s +# Warmup Iteration 12: 836.796 ops/s +# Warmup Iteration 13: 903.057 ops/s +# Warmup Iteration 14: 917.454 ops/s +# Warmup Iteration 15: 984.463 ops/s +# Warmup Iteration 16: 745.709 ops/s +# Warmup Iteration 17: 852.507 ops/s +# Warmup Iteration 18: 861.899 ops/s +# Warmup Iteration 19: 735.401 ops/s +# Warmup Iteration 20: 743.095 ops/s +Iteration 1: 768.882 ops/s +Iteration 2: 913.668 ops/s +Iteration 3: 960.738 ops/s +Iteration 4: 1002.675 ops/s +Iteration 5: 1008.548 ops/s +Iteration 6: 805.313 ops/s +Iteration 7: 1040.246 ops/s +Iteration 8: 965.695 ops/s +Iteration 9: 1085.362 ops/s +Iteration 10: 1250.257 ops/s +Iteration 11: 1330.564 ops/s +Iteration 12: 1323.816 ops/s +Iteration 13: 1386.685 ops/s +Iteration 14: 1505.622 ops/s +Iteration 15: 1476.758 ops/s +Iteration 16: 1485.842 ops/s +Iteration 17: 1491.053 ops/s +Iteration 18: 1446.873 ops/s +Iteration 19: 1483.167 ops/s +Iteration 20: 1400.869 ops/s + + +Result "metrifier.benchmark.HttpBenchmark.listPersons": + 1196.642 ±(99.9%) 153.626 ops/s [Average] + (min, avg, max) = (767.921, 1196.642, 1639.802), stdev = 273.071 + CI (99.9%): [1043.015, 1350.268] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.HttpBenchmark.programComposition + +# Run progress: 80.00% complete, ETA 00:01:46 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.126 ops/s +# Warmup Iteration 2: 24.820 ops/s +# Warmup Iteration 3: 38.095 ops/s +# Warmup Iteration 4: 39.602 ops/s +# Warmup Iteration 5: 51.141 ops/s +# Warmup Iteration 6: 61.553 ops/s +# Warmup Iteration 7: 65.855 ops/s +# Warmup Iteration 8: 84.342 ops/s +# Warmup Iteration 9: 93.210 ops/s +# Warmup Iteration 10: 105.216 ops/s +# Warmup Iteration 11: 99.768 ops/s +# Warmup Iteration 12: 97.838 ops/s +# Warmup Iteration 13: 95.544 ops/s +# Warmup Iteration 14: 116.726 ops/s +# Warmup Iteration 15: 115.554 ops/s +# Warmup Iteration 16: 130.424 ops/s +# Warmup Iteration 17: 115.120 ops/s +# Warmup Iteration 18: 124.321 ops/s +# Warmup Iteration 19: 142.909 ops/s +# Warmup Iteration 20: 145.010 ops/s +Iteration 1: 110.528 ops/s +Iteration 2: 123.425 ops/s +Iteration 3: 126.524 ops/s +Iteration 4: 124.235 ops/s +Iteration 5: 130.630 ops/s +Iteration 6: 159.176 ops/s +Iteration 7: 163.503 ops/s +Iteration 8: 184.231 ops/s +Iteration 9: 135.816 ops/s +Iteration 10: 135.833 ops/s +Iteration 11: 136.156 ops/s +Iteration 12: 129.846 ops/s +Iteration 13: 124.532 ops/s +Iteration 14: 159.788 ops/s +Iteration 15: 200.258 ops/s +Iteration 16: 177.197 ops/s +Iteration 17: 178.353 ops/s +Iteration 18: 151.999 ops/s +Iteration 19: 170.728 ops/s +Iteration 20: 163.605 ops/s + +# Run progress: 90.00% complete, ETA 00:00:53 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.134 ops/s +# Warmup Iteration 2: 25.393 ops/s +# Warmup Iteration 3: 41.870 ops/s +# Warmup Iteration 4: 39.793 ops/s +# Warmup Iteration 5: 44.297 ops/s +# Warmup Iteration 6: 54.802 ops/s +# Warmup Iteration 7: 61.872 ops/s +# Warmup Iteration 8: 73.355 ops/s +# Warmup Iteration 9: 82.194 ops/s +# Warmup Iteration 10: 83.752 ops/s +# Warmup Iteration 11: 91.549 ops/s +# Warmup Iteration 12: 80.906 ops/s +# Warmup Iteration 13: 97.008 ops/s +# Warmup Iteration 14: 110.968 ops/s +# Warmup Iteration 15: 108.896 ops/s +# Warmup Iteration 16: 107.333 ops/s +# Warmup Iteration 17: 99.983 ops/s +# Warmup Iteration 18: 83.325 ops/s +# Warmup Iteration 19: 131.745 ops/s +# Warmup Iteration 20: 121.780 ops/s +Iteration 1: 126.371 ops/s +Iteration 2: 115.972 ops/s +Iteration 3: 114.048 ops/s +Iteration 4: 139.942 ops/s +Iteration 5: 135.529 ops/s +Iteration 6: 165.053 ops/s +Iteration 7: 152.518 ops/s +Iteration 8: 159.108 ops/s +Iteration 9: 161.896 ops/s +Iteration 10: 193.854 ops/s +Iteration 11: 166.213 ops/s +Iteration 12: 170.312 ops/s +Iteration 13: 193.627 ops/s +Iteration 14: 166.631 ops/s +Iteration 15: 208.305 ops/s +Iteration 16: 199.590 ops/s +Iteration 17: 167.351 ops/s +Iteration 18: 176.327 ops/s +Iteration 19: 181.865 ops/s +Iteration 20: 182.826 ops/s + + +Result "metrifier.benchmark.HttpBenchmark.programComposition": + 156.592 ±(99.9%) 14.936 ops/s [Average] + (min, avg, max) = (110.528, 156.592, 208.305), stdev = 26.548 + CI (99.9%): [141.657, 171.528] (assumes normal distribution) + + +# Run complete. Total time: 00:08:52 + +Benchmark Mode Cnt Score Error Units +HttpBenchmark.createPerson thrpt 40 861.052 ± 106.109 ops/s +HttpBenchmark.getPerson thrpt 40 1569.770 ± 153.491 ops/s +HttpBenchmark.getPersonLinks thrpt 40 1072.277 ± 131.565 ops/s +HttpBenchmark.listPersons thrpt 40 1196.642 ± 153.626 ops/s +HttpBenchmark.programComposition thrpt 40 156.592 ± 14.936 ops/s ``` ## jmh - frees-rpc ```bash -[info] Running (fork) org.openjdk.jmh.Main -i 10 -wi 10 -f 2 -t 1 metrifier.benchmark.RPCBenchmark -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.RPCBenchmark.createPerson -[info] # Run progress: 0.00% complete, ETA 00:03:20 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.087 ops/s -[info] # Warmup Iteration 2: 8.928 ops/s -[info] # Warmup Iteration 3: 9.133 ops/s -[info] # Warmup Iteration 4: 9.098 ops/s -[info] # Warmup Iteration 5: 9.235 ops/s -[info] # Warmup Iteration 6: 9.159 ops/s -[info] # Warmup Iteration 7: 9.216 ops/s -[info] # Warmup Iteration 8: 9.254 ops/s -[info] # Warmup Iteration 9: 9.197 ops/s -[info] # Warmup Iteration 10: 9.265 ops/s -[info] Iteration 1: 9.260 ops/s -[info] Iteration 2: 9.333 ops/s -[info] Iteration 3: 9.240 ops/s -[info] Iteration 4: 9.240 ops/s -[info] Iteration 5: 9.305 ops/s -[info] Iteration 6: 9.247 ops/s -[info] Iteration 7: 9.297 ops/s -[info] Iteration 8: 9.251 ops/s -[info] Iteration 9: 9.331 ops/s -[info] Iteration 10: 9.271 ops/s -[info] # Run progress: 10.00% complete, ETA 00:05:42 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.088 ops/s -[info] # Warmup Iteration 2: 9.033 ops/s -[info] # Warmup Iteration 3: 9.185 ops/s -[info] # Warmup Iteration 4: 9.254 ops/s -[info] # Warmup Iteration 5: 9.267 ops/s -[info] # Warmup Iteration 6: 9.289 ops/s -[info] # Warmup Iteration 7: 9.276 ops/s -[info] # Warmup Iteration 8: 9.292 ops/s -[info] # Warmup Iteration 9: 9.405 ops/s -[info] # Warmup Iteration 10: 9.332 ops/s -[info] Iteration 1: 9.249 ops/s -[info] Iteration 2: 9.290 ops/s -[info] Iteration 3: 9.334 ops/s -[info] Iteration 4: 9.375 ops/s -[info] Iteration 5: 9.408 ops/s -[info] Iteration 6: 9.268 ops/s -[info] Iteration 7: 9.358 ops/s -[info] Iteration 8: 9.259 ops/s -[info] Iteration 9: 9.365 ops/s -[info] Iteration 10: 9.285 ops/s -[info] Result "metrifier.benchmark.RPCBenchmark.createPerson": -[info] 9.298 ±(99.9%) 0.044 ops/s [Average] -[info] (min, avg, max) = (9.240, 9.298, 9.408), stdev = 0.050 -[info] CI (99.9%): [9.254, 9.342] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.RPCBenchmark.getPerson -[info] # Run progress: 20.00% complete, ETA 00:05:02 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.089 ops/s -[info] # Warmup Iteration 2: 335.667 ops/s -[info] # Warmup Iteration 3: 425.636 ops/s -[info] # Warmup Iteration 4: 507.482 ops/s -[info] # Warmup Iteration 5: 607.567 ops/s -[info] # Warmup Iteration 6: 739.196 ops/s -[info] # Warmup Iteration 7: 1018.982 ops/s -[info] # Warmup Iteration 8: 1210.378 ops/s -[info] # Warmup Iteration 9: 1032.442 ops/s -[info] # Warmup Iteration 10: 1505.626 ops/s -[info] Iteration 1: 1414.794 ops/s -[info] Iteration 2: 1558.914 ops/s -[info] Iteration 3: 1983.469 ops/s -[info] Iteration 4: 2057.577 ops/s -[info] Iteration 5: 2774.966 ops/s -[info] Iteration 6: 2782.472 ops/s -[info] Iteration 7: 4085.283 ops/s -[info] Iteration 8: 4112.476 ops/s -[info] Iteration 9: 4297.841 ops/s -[info] Iteration 10: 4361.512 ops/s -[info] # Run progress: 30.00% complete, ETA 00:04:20 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.089 ops/s -[info] # Warmup Iteration 2: 506.440 ops/s -[info] # Warmup Iteration 3: 776.901 ops/s -[info] # Warmup Iteration 4: 841.528 ops/s -[info] # Warmup Iteration 5: 1240.139 ops/s -[info] # Warmup Iteration 6: 1804.451 ops/s -[info] # Warmup Iteration 7: 1637.576 ops/s -[info] # Warmup Iteration 8: 2329.147 ops/s -[info] # Warmup Iteration 9: 2211.617 ops/s -[info] # Warmup Iteration 10: 2505.123 ops/s -[info] Iteration 1: 2864.172 ops/s -[info] Iteration 2: 2927.036 ops/s -[info] Iteration 3: 4266.366 ops/s -[info] Iteration 4: 4495.163 ops/s -[info] Iteration 5: 4587.056 ops/s -[info] Iteration 6: 4479.009 ops/s -[info] Iteration 7: 4432.784 ops/s -[info] Iteration 8: 4393.625 ops/s -[info] Iteration 9: 4469.990 ops/s -[info] Iteration 10: 4545.855 ops/s -[info] Result "metrifier.benchmark.RPCBenchmark.getPerson": -[info] 3544.518 ±(99.9%) 970.798 ops/s [Average] -[info] (min, avg, max) = (1414.794, 3544.518, 4587.056), stdev = 1117.973 -[info] CI (99.9%): [2573.720, 4515.316] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.RPCBenchmark.getPersonLinks -[info] # Run progress: 40.00% complete, ETA 00:03:41 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.089 ops/s -[info] # Warmup Iteration 2: 428.856 ops/s -[info] # Warmup Iteration 3: 546.378 ops/s -[info] # Warmup Iteration 4: 732.654 ops/s -[info] # Warmup Iteration 5: 997.706 ops/s -[info] # Warmup Iteration 6: 1524.494 ops/s -[info] # Warmup Iteration 7: 1673.672 ops/s -[info] # Warmup Iteration 8: 1777.518 ops/s -[info] # Warmup Iteration 9: 1967.263 ops/s -[info] # Warmup Iteration 10: 1826.859 ops/s -[info] Iteration 1: 2267.142 ops/s -[info] Iteration 2: 2175.704 ops/s -[info] Iteration 3: 2155.522 ops/s -[info] Iteration 4: 2509.512 ops/s -[info] Iteration 5: 2430.407 ops/s -[info] Iteration 6: 2951.934 ops/s -[info] Iteration 7: 2979.554 ops/s -[info] Iteration 8: 2993.155 ops/s -[info] Iteration 9: 2919.544 ops/s -[info] Iteration 10: 3058.664 ops/s -[info] # Run progress: 50.00% complete, ETA 00:03:03 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.089 ops/s -[info] # Warmup Iteration 2: 489.100 ops/s -[info] # Warmup Iteration 3: 641.331 ops/s -[info] # Warmup Iteration 4: 773.263 ops/s -[info] # Warmup Iteration 5: 1102.488 ops/s -[info] # Warmup Iteration 6: 1403.911 ops/s -[info] # Warmup Iteration 7: 1576.466 ops/s -[info] # Warmup Iteration 8: 1919.126 ops/s -[info] # Warmup Iteration 9: 1930.432 ops/s -[info] # Warmup Iteration 10: 1961.104 ops/s -[info] Iteration 1: 2333.966 ops/s -[info] Iteration 2: 2517.811 ops/s -[info] Iteration 3: 2435.771 ops/s -[info] Iteration 4: 2627.235 ops/s -[info] Iteration 5: 2964.152 ops/s -[info] Iteration 6: 2967.974 ops/s -[info] Iteration 7: 3008.928 ops/s -[info] Iteration 8: 2950.128 ops/s -[info] Iteration 9: 2938.871 ops/s -[info] Iteration 10: 2978.464 ops/s -[info] Result "metrifier.benchmark.RPCBenchmark.getPersonLinks": -[info] 2708.222 ±(99.9%) 277.988 ops/s [Average] -[info] (min, avg, max) = (2155.522, 2708.222, 3058.664), stdev = 320.131 -[info] CI (99.9%): [2430.234, 2986.210] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.RPCBenchmark.listPersons -[info] # Run progress: 60.00% complete, ETA 00:02:26 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.088 ops/s -[info] # Warmup Iteration 2: 467.512 ops/s -[info] # Warmup Iteration 3: 667.659 ops/s -[info] # Warmup Iteration 4: 790.928 ops/s -[info] # Warmup Iteration 5: 1121.082 ops/s -[info] # Warmup Iteration 6: 1581.186 ops/s -[info] # Warmup Iteration 7: 1721.557 ops/s -[info] # Warmup Iteration 8: 2000.256 ops/s -[info] # Warmup Iteration 9: 2271.634 ops/s -[info] # Warmup Iteration 10: 2205.771 ops/s -[info] Iteration 1: 2766.881 ops/s -[info] Iteration 2: 2771.500 ops/s -[info] Iteration 3: 3212.588 ops/s -[info] Iteration 4: 2969.895 ops/s -[info] Iteration 5: 3145.499 ops/s -[info] Iteration 6: 3093.416 ops/s -[info] Iteration 7: 3129.978 ops/s -[info] Iteration 8: 3222.880 ops/s -[info] Iteration 9: 3328.964 ops/s -[info] Iteration 10: 3265.203 ops/s -[info] # Run progress: 70.00% complete, ETA 00:01:49 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.089 ops/s -[info] # Warmup Iteration 2: 558.575 ops/s -[info] # Warmup Iteration 3: 786.354 ops/s -[info] # Warmup Iteration 4: 944.371 ops/s -[info] # Warmup Iteration 5: 1534.257 ops/s -[info] # Warmup Iteration 6: 1764.903 ops/s -[info] # Warmup Iteration 7: 1908.468 ops/s -[info] # Warmup Iteration 8: 1968.196 ops/s -[info] # Warmup Iteration 9: 2218.330 ops/s -[info] # Warmup Iteration 10: 2686.059 ops/s -[info] Iteration 1: 2771.567 ops/s -[info] Iteration 2: 2769.097 ops/s -[info] Iteration 3: 3258.413 ops/s -[info] Iteration 4: 2717.509 ops/s -[info] Iteration 5: 2149.818 ops/s -[info] Iteration 6: 2270.190 ops/s -[info] Iteration 7: 3540.655 ops/s -[info] Iteration 8: 3393.370 ops/s -[info] Iteration 9: 3543.098 ops/s -[info] Iteration 10: 3526.124 ops/s -[info] Result "metrifier.benchmark.RPCBenchmark.listPersons": -[info] 3042.332 ±(99.9%) 340.310 ops/s [Average] -[info] (min, avg, max) = (2149.818, 3042.332, 3543.098), stdev = 391.902 -[info] CI (99.9%): [2702.022, 3382.642] (assumes normal distribution) - -[info] # JMH version: 1.19 -[info] # VM version: JDK 1.8.0_131, VM 25.131-b11 -[info] # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java -[info] # VM options: -[info] # Warmup: 10 iterations, 1 s each -[info] # Measurement: 10 iterations, 1 s each -[info] # Timeout: 10 min per iteration -[info] # Threads: 1 thread, will synchronize iterations -[info] # Benchmark mode: Throughput, ops/time -[info] # Benchmark: metrifier.benchmark.RPCBenchmark.programComposition -[info] # Run progress: 80.00% complete, ETA 00:01:13 -[info] # Fork: 1 of 2 -[info] # Warmup Iteration 1: 0.088 ops/s -[info] # Warmup Iteration 2: 7.900 ops/s -[info] # Warmup Iteration 3: 8.180 ops/s -[info] # Warmup Iteration 4: 8.409 ops/s -[info] # Warmup Iteration 5: 8.534 ops/s -[info] # Warmup Iteration 6: 8.619 ops/s -[info] # Warmup Iteration 7: 8.609 ops/s -[info] # Warmup Iteration 8: 8.725 ops/s -[info] # Warmup Iteration 9: 8.644 ops/s -[info] # Warmup Iteration 10: 8.661 ops/s -[info] Iteration 1: 8.656 ops/s -[info] Iteration 2: 8.661 ops/s -[info] Iteration 3: 8.717 ops/s -[info] Iteration 4: 8.709 ops/s -[info] Iteration 5: 8.714 ops/s -[info] Iteration 6: 8.777 ops/s -[info] Iteration 7: 8.715 ops/s -[info] Iteration 8: 8.843 ops/s -[info] Iteration 9: 8.835 ops/s -[info] Iteration 10: 8.881 ops/s -[info] # Run progress: 90.00% complete, ETA 00:00:36 -[info] # Fork: 2 of 2 -[info] # Warmup Iteration 1: 0.088 ops/s -[info] # Warmup Iteration 2: 8.146 ops/s -[info] # Warmup Iteration 3: 8.432 ops/s -[info] # Warmup Iteration 4: 8.393 ops/s -[info] # Warmup Iteration 5: 8.653 ops/s -[info] # Warmup Iteration 6: 8.651 ops/s -[info] # Warmup Iteration 7: 8.641 ops/s -[info] # Warmup Iteration 8: 8.662 ops/s -[info] # Warmup Iteration 9: 8.729 ops/s -[info] # Warmup Iteration 10: 8.737 ops/s -[info] Iteration 1: 8.690 ops/s -[info] Iteration 2: 8.686 ops/s -[info] Iteration 3: 8.708 ops/s -[info] Iteration 4: 8.699 ops/s -[info] Iteration 5: 8.745 ops/s -[info] Iteration 6: 8.824 ops/s -[info] Iteration 7: 8.871 ops/s -[info] Iteration 8: 8.765 ops/s -[info] Iteration 9: 8.724 ops/s -[info] Iteration 10: 8.873 ops/s -[info] Result "metrifier.benchmark.RPCBenchmark.programComposition": -[info] 8.755 ±(99.9%) 0.064 ops/s [Average] -[info] (min, avg, max) = (8.656, 8.755, 8.881), stdev = 0.074 -[info] CI (99.9%): [8.690, 8.819] (assumes normal distribution) - -[info] # Run complete. Total time: 00:06:06 -[info] Benchmark Mode Cnt Score Error Units -[info] RPCBenchmark.createPerson thrpt 20 9.298 ± 0.044 ops/s -[info] RPCBenchmark.getPerson thrpt 20 3544.518 ± 970.798 ops/s -[info] RPCBenchmark.getPersonLinks thrpt 20 2708.222 ± 277.988 ops/s -[info] RPCBenchmark.listPersons thrpt 20 3042.332 ± 340.310 ops/s -[info] RPCBenchmark.programComposition thrpt 20 8.755 ± 0.064 ops/s +[info] Running (fork) org.openjdk.jmh.Main -i 20 -wi 20 -f 2 -t 1 metrifier.benchmark.RPCBenchmark +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.RPCBenchmark.createPerson + +# Run progress: 0.00% complete, ETA 00:06:40 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.154 ops/s +# Warmup Iteration 2: 192.381 ops/s +# Warmup Iteration 3: 260.544 ops/s +# Warmup Iteration 4: 278.862 ops/s +# Warmup Iteration 5: 280.385 ops/s +# Warmup Iteration 6: 322.644 ops/s +# Warmup Iteration 7: 393.450 ops/s +# Warmup Iteration 8: 482.318 ops/s +# Warmup Iteration 9: 597.713 ops/s +# Warmup Iteration 10: 576.653 ops/s +# Warmup Iteration 11: 610.467 ops/s +# Warmup Iteration 12: 644.982 ops/s +# Warmup Iteration 13: 826.077 ops/s +# Warmup Iteration 14: 914.673 ops/s +# Warmup Iteration 15: 984.586 ops/s +# Warmup Iteration 16: 936.530 ops/s +# Warmup Iteration 17: 974.525 ops/s +# Warmup Iteration 18: 932.816 ops/s +# Warmup Iteration 19: 963.531 ops/s +# Warmup Iteration 20: 1030.966 ops/s +Iteration 1: 1035.215 ops/s +Iteration 2: 1412.778 ops/s +Iteration 3: 1305.046 ops/s +Iteration 4: 1548.403 ops/s +Iteration 5: 2128.105 ops/s +Iteration 6: 1689.179 ops/s +Iteration 7: 2014.035 ops/s +Iteration 8: 2296.389 ops/s +Iteration 9: 2020.910 ops/s +Iteration 10: 2262.050 ops/s +Iteration 11: 2217.983 ops/s +Iteration 12: 1880.587 ops/s +Iteration 13: 2176.550 ops/s +Iteration 14: 2030.937 ops/s +Iteration 15: 2179.013 ops/s +Iteration 16: 1904.921 ops/s +Iteration 17: 1626.177 ops/s +Iteration 18: 2163.083 ops/s +Iteration 19: 1851.339 ops/s +Iteration 20: 1873.239 ops/s + +# Run progress: 10.00% complete, ETA 00:08:44 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.180 ops/s +# Warmup Iteration 2: 337.431 ops/s +# Warmup Iteration 3: 428.068 ops/s +# Warmup Iteration 4: 478.148 ops/s +# Warmup Iteration 5: 565.922 ops/s +# Warmup Iteration 6: 844.749 ops/s +# Warmup Iteration 7: 1176.693 ops/s +# Warmup Iteration 8: 1163.876 ops/s +# Warmup Iteration 9: 819.152 ops/s +# Warmup Iteration 10: 1310.639 ops/s +# Warmup Iteration 11: 1565.872 ops/s +# Warmup Iteration 12: 1566.321 ops/s +# Warmup Iteration 13: 1771.814 ops/s +# Warmup Iteration 14: 2067.244 ops/s +# Warmup Iteration 15: 2378.866 ops/s +# Warmup Iteration 16: 2297.863 ops/s +# Warmup Iteration 17: 2311.644 ops/s +# Warmup Iteration 18: 2865.944 ops/s +# Warmup Iteration 19: 2364.024 ops/s +# Warmup Iteration 20: 2235.324 ops/s +Iteration 1: 2277.146 ops/s +Iteration 2: 2093.387 ops/s +Iteration 3: 2385.067 ops/s +Iteration 4: 2630.150 ops/s +Iteration 5: 2090.534 ops/s +Iteration 6: 1702.359 ops/s +Iteration 7: 2113.904 ops/s +Iteration 8: 2271.176 ops/s +Iteration 9: 2730.623 ops/s +Iteration 10: 2675.342 ops/s +Iteration 11: 2005.980 ops/s +Iteration 12: 2398.788 ops/s +Iteration 13: 2128.959 ops/s +Iteration 14: 2162.417 ops/s +Iteration 15: 2332.151 ops/s +Iteration 16: 2837.976 ops/s +Iteration 17: 2482.643 ops/s +Iteration 18: 2575.692 ops/s +Iteration 19: 2713.262 ops/s +Iteration 20: 2871.190 ops/s + + +Result "metrifier.benchmark.RPCBenchmark.createPerson": + 2127.367 ±(99.9%) 230.981 ops/s [Average] + (min, avg, max) = (1035.215, 2127.367, 2871.190), stdev = 410.568 + CI (99.9%): [1896.386, 2358.348] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.RPCBenchmark.getPerson + +# Run progress: 20.00% complete, ETA 00:07:42 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.182 ops/s +# Warmup Iteration 2: 324.330 ops/s +# Warmup Iteration 3: 410.025 ops/s +# Warmup Iteration 4: 470.636 ops/s +# Warmup Iteration 5: 541.206 ops/s +# Warmup Iteration 6: 660.464 ops/s +# Warmup Iteration 7: 905.799 ops/s +# Warmup Iteration 8: 1194.153 ops/s +# Warmup Iteration 9: 829.156 ops/s +# Warmup Iteration 10: 721.486 ops/s +# Warmup Iteration 11: 1288.038 ops/s +# Warmup Iteration 12: 1310.757 ops/s +# Warmup Iteration 13: 1486.596 ops/s +# Warmup Iteration 14: 1319.155 ops/s +# Warmup Iteration 15: 1369.844 ops/s +# Warmup Iteration 16: 1623.704 ops/s +# Warmup Iteration 17: 1400.002 ops/s +# Warmup Iteration 18: 2251.643 ops/s +# Warmup Iteration 19: 2299.739 ops/s +# Warmup Iteration 20: 2295.519 ops/s +Iteration 1: 2874.776 ops/s +Iteration 2: 3086.769 ops/s +Iteration 3: 3337.998 ops/s +Iteration 4: 3121.565 ops/s +Iteration 5: 3093.885 ops/s +Iteration 6: 3173.111 ops/s +Iteration 7: 3003.206 ops/s +Iteration 8: 2935.255 ops/s +Iteration 9: 2635.715 ops/s +Iteration 10: 2436.850 ops/s +Iteration 11: 2383.921 ops/s +Iteration 12: 3143.103 ops/s +Iteration 13: 3230.374 ops/s +Iteration 14: 3168.783 ops/s +Iteration 15: 3007.485 ops/s +Iteration 16: 2163.478 ops/s +Iteration 17: 3004.713 ops/s +Iteration 18: 2265.449 ops/s +Iteration 19: 2613.948 ops/s +Iteration 20: 3084.343 ops/s + +# Run progress: 30.00% complete, ETA 00:06:42 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.176 ops/s +# Warmup Iteration 2: 408.947 ops/s +# Warmup Iteration 3: 581.809 ops/s +# Warmup Iteration 4: 634.802 ops/s +# Warmup Iteration 5: 796.445 ops/s +# Warmup Iteration 6: 1000.073 ops/s +# Warmup Iteration 7: 1196.927 ops/s +# Warmup Iteration 8: 1212.072 ops/s +# Warmup Iteration 9: 1518.033 ops/s +# Warmup Iteration 10: 1704.838 ops/s +# Warmup Iteration 11: 1654.255 ops/s +# Warmup Iteration 12: 1702.077 ops/s +# Warmup Iteration 13: 2212.329 ops/s +# Warmup Iteration 14: 2084.896 ops/s +# Warmup Iteration 15: 2283.804 ops/s +# Warmup Iteration 16: 2214.941 ops/s +# Warmup Iteration 17: 2852.636 ops/s +# Warmup Iteration 18: 2694.319 ops/s +# Warmup Iteration 19: 3011.359 ops/s +# Warmup Iteration 20: 3202.431 ops/s +Iteration 1: 2895.884 ops/s +Iteration 2: 2777.869 ops/s +Iteration 3: 2711.071 ops/s +Iteration 4: 3002.440 ops/s +Iteration 5: 3173.874 ops/s +Iteration 6: 3122.955 ops/s +Iteration 7: 3123.562 ops/s +Iteration 8: 3168.717 ops/s +Iteration 9: 3118.827 ops/s +Iteration 10: 3060.872 ops/s +Iteration 11: 3162.299 ops/s +Iteration 12: 2801.870 ops/s +Iteration 13: 3064.543 ops/s +Iteration 14: 3061.916 ops/s +Iteration 15: 2709.526 ops/s +Iteration 16: 3117.510 ops/s +Iteration 17: 2209.893 ops/s +Iteration 18: 2066.080 ops/s +Iteration 19: 2183.551 ops/s +Iteration 20: 2063.038 ops/s + + +Result "metrifier.benchmark.RPCBenchmark.getPerson": + 2859.026 ±(99.9%) 205.242 ops/s [Average] + (min, avg, max) = (2063.038, 2859.026, 3337.998), stdev = 364.817 + CI (99.9%): [2653.784, 3064.268] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.RPCBenchmark.getPersonLinks + +# Run progress: 40.00% complete, ETA 00:05:45 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.180 ops/s +# Warmup Iteration 2: 291.306 ops/s +# Warmup Iteration 3: 434.144 ops/s +# Warmup Iteration 4: 511.565 ops/s +# Warmup Iteration 5: 531.509 ops/s +# Warmup Iteration 6: 579.052 ops/s +# Warmup Iteration 7: 912.678 ops/s +# Warmup Iteration 8: 1054.999 ops/s +# Warmup Iteration 9: 1040.767 ops/s +# Warmup Iteration 10: 953.222 ops/s +# Warmup Iteration 11: 1224.156 ops/s +# Warmup Iteration 12: 1349.741 ops/s +# Warmup Iteration 13: 1387.215 ops/s +# Warmup Iteration 14: 1471.958 ops/s +# Warmup Iteration 15: 1487.068 ops/s +# Warmup Iteration 16: 1809.709 ops/s +# Warmup Iteration 17: 1852.433 ops/s +# Warmup Iteration 18: 1524.875 ops/s +# Warmup Iteration 19: 1779.094 ops/s +# Warmup Iteration 20: 1872.224 ops/s +Iteration 1: 1623.525 ops/s +Iteration 2: 1637.059 ops/s +Iteration 3: 1437.481 ops/s +Iteration 4: 1328.963 ops/s +Iteration 5: 1525.311 ops/s +Iteration 6: 1840.821 ops/s +Iteration 7: 1870.783 ops/s +Iteration 8: 2040.122 ops/s +Iteration 9: 1883.969 ops/s +Iteration 10: 2032.336 ops/s +Iteration 11: 1983.127 ops/s +Iteration 12: 2160.460 ops/s +Iteration 13: 2090.215 ops/s +Iteration 14: 2053.201 ops/s +Iteration 15: 1950.753 ops/s +Iteration 16: 1861.109 ops/s +Iteration 17: 1968.809 ops/s +Iteration 18: 2097.212 ops/s +Iteration 19: 1739.551 ops/s +Iteration 20: 1734.083 ops/s + +# Run progress: 50.00% complete, ETA 00:04:47 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.180 ops/s +# Warmup Iteration 2: 304.170 ops/s +# Warmup Iteration 3: 332.257 ops/s +# Warmup Iteration 4: 488.218 ops/s +# Warmup Iteration 5: 661.410 ops/s +# Warmup Iteration 6: 813.314 ops/s +# Warmup Iteration 7: 970.517 ops/s +# Warmup Iteration 8: 1070.327 ops/s +# Warmup Iteration 9: 1083.941 ops/s +# Warmup Iteration 10: 1024.556 ops/s +# Warmup Iteration 11: 1312.638 ops/s +# Warmup Iteration 12: 1131.589 ops/s +# Warmup Iteration 13: 1177.159 ops/s +# Warmup Iteration 14: 1402.716 ops/s +# Warmup Iteration 15: 1178.328 ops/s +# Warmup Iteration 16: 1741.737 ops/s +# Warmup Iteration 17: 1655.404 ops/s +# Warmup Iteration 18: 1716.449 ops/s +# Warmup Iteration 19: 1823.442 ops/s +# Warmup Iteration 20: 1750.450 ops/s +Iteration 1: 1954.201 ops/s +Iteration 2: 2022.508 ops/s +Iteration 3: 2045.386 ops/s +Iteration 4: 2056.562 ops/s +Iteration 5: 1847.823 ops/s +Iteration 6: 1723.506 ops/s +Iteration 7: 2113.454 ops/s +Iteration 8: 2032.263 ops/s +Iteration 9: 2066.021 ops/s +Iteration 10: 2065.615 ops/s +Iteration 11: 2085.478 ops/s +Iteration 12: 1977.578 ops/s +Iteration 13: 2096.920 ops/s +Iteration 14: 2077.126 ops/s +Iteration 15: 2010.020 ops/s +Iteration 16: 1544.918 ops/s +Iteration 17: 1995.743 ops/s +Iteration 18: 1882.912 ops/s +Iteration 19: 1584.066 ops/s +Iteration 20: 1311.266 ops/s + + +Result "metrifier.benchmark.RPCBenchmark.getPersonLinks": + 1883.806 ±(99.9%) 127.808 ops/s [Average] + (min, avg, max) = (1311.266, 1883.806, 2160.460), stdev = 227.178 + CI (99.9%): [1755.999, 2011.614] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.RPCBenchmark.listPersons + +# Run progress: 60.00% complete, ETA 00:03:49 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.181 ops/s +# Warmup Iteration 2: 380.089 ops/s +# Warmup Iteration 3: 445.259 ops/s +# Warmup Iteration 4: 510.666 ops/s +# Warmup Iteration 5: 670.775 ops/s +# Warmup Iteration 6: 909.701 ops/s +# Warmup Iteration 7: 1235.208 ops/s +# Warmup Iteration 8: 1258.107 ops/s +# Warmup Iteration 9: 1359.628 ops/s +# Warmup Iteration 10: 1444.454 ops/s +# Warmup Iteration 11: 1381.628 ops/s +# Warmup Iteration 12: 1032.360 ops/s +# Warmup Iteration 13: 980.337 ops/s +# Warmup Iteration 14: 1458.340 ops/s +# Warmup Iteration 15: 1722.351 ops/s +# Warmup Iteration 16: 1644.471 ops/s +# Warmup Iteration 17: 1585.762 ops/s +# Warmup Iteration 18: 1918.516 ops/s +# Warmup Iteration 19: 1320.907 ops/s +# Warmup Iteration 20: 1345.907 ops/s +Iteration 1: 1213.685 ops/s +Iteration 2: 1777.066 ops/s +Iteration 3: 1483.956 ops/s +Iteration 4: 1433.393 ops/s +Iteration 5: 1262.279 ops/s +Iteration 6: 1360.825 ops/s +Iteration 7: 1259.882 ops/s +Iteration 8: 1498.685 ops/s +Iteration 9: 2081.052 ops/s +Iteration 10: 2202.749 ops/s +Iteration 11: 1820.549 ops/s +Iteration 12: 1992.385 ops/s +Iteration 13: 1612.698 ops/s +Iteration 14: 1857.307 ops/s +Iteration 15: 1699.988 ops/s +Iteration 16: 2191.358 ops/s +Iteration 17: 2014.671 ops/s +Iteration 18: 2031.415 ops/s +Iteration 19: 2028.513 ops/s +Iteration 20: 2242.841 ops/s + +# Run progress: 70.00% complete, ETA 00:02:51 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.179 ops/s +# Warmup Iteration 2: 319.701 ops/s +# Warmup Iteration 3: 437.906 ops/s +# Warmup Iteration 4: 576.166 ops/s +# Warmup Iteration 5: 657.651 ops/s +# Warmup Iteration 6: 854.376 ops/s +# Warmup Iteration 7: 1091.921 ops/s +# Warmup Iteration 8: 1213.127 ops/s +# Warmup Iteration 9: 1240.434 ops/s +# Warmup Iteration 10: 1278.139 ops/s +# Warmup Iteration 11: 1330.209 ops/s +# Warmup Iteration 12: 1568.145 ops/s +# Warmup Iteration 13: 1687.060 ops/s +# Warmup Iteration 14: 1652.584 ops/s +# Warmup Iteration 15: 1439.405 ops/s +# Warmup Iteration 16: 1645.078 ops/s +# Warmup Iteration 17: 1787.699 ops/s +# Warmup Iteration 18: 2203.023 ops/s +# Warmup Iteration 19: 1716.569 ops/s +# Warmup Iteration 20: 1906.861 ops/s +Iteration 1: 1728.809 ops/s +Iteration 2: 1631.305 ops/s +Iteration 3: 1485.830 ops/s +Iteration 4: 1536.760 ops/s +Iteration 5: 1520.312 ops/s +Iteration 6: 1345.151 ops/s +Iteration 7: 1700.131 ops/s +Iteration 8: 1764.998 ops/s +Iteration 9: 1982.751 ops/s +Iteration 10: 1967.028 ops/s +Iteration 11: 1991.093 ops/s +Iteration 12: 2260.526 ops/s +Iteration 13: 1908.764 ops/s +Iteration 14: 1562.790 ops/s +Iteration 15: 1667.919 ops/s +Iteration 16: 1732.664 ops/s +Iteration 17: 2008.773 ops/s +Iteration 18: 1798.641 ops/s +Iteration 19: 1753.723 ops/s +Iteration 20: 2070.622 ops/s + + +Result "metrifier.benchmark.RPCBenchmark.listPersons": + 1762.097 ±(99.9%) 161.918 ops/s [Average] + (min, avg, max) = (1213.685, 1762.097, 2260.526), stdev = 287.810 + CI (99.9%): [1600.179, 1924.016] (assumes normal distribution) + + +# JMH version: 1.19 +# VM version: JDK 1.8.0_131, VM 25.131-b11 +# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home/jre/bin/java +# VM options: +# Warmup: 20 iterations, 1 s each +# Measurement: 20 iterations, 1 s each +# Timeout: 10 min per iteration +# Threads: 1 thread, will synchronize iterations +# Benchmark mode: Throughput, ops/time +# Benchmark: metrifier.benchmark.RPCBenchmark.programComposition + +# Run progress: 80.00% complete, ETA 00:01:54 +# Fork: 1 of 2 +# Warmup Iteration 1: 0.178 ops/s +# Warmup Iteration 2: 51.168 ops/s +# Warmup Iteration 3: 72.666 ops/s +# Warmup Iteration 4: 71.528 ops/s +# Warmup Iteration 5: 100.306 ops/s +# Warmup Iteration 6: 132.851 ops/s +# Warmup Iteration 7: 148.004 ops/s +# Warmup Iteration 8: 150.284 ops/s +# Warmup Iteration 9: 148.301 ops/s +# Warmup Iteration 10: 206.374 ops/s +# Warmup Iteration 11: 194.166 ops/s +# Warmup Iteration 12: 163.520 ops/s +# Warmup Iteration 13: 208.996 ops/s +# Warmup Iteration 14: 225.412 ops/s +# Warmup Iteration 15: 234.367 ops/s +# Warmup Iteration 16: 226.385 ops/s +# Warmup Iteration 17: 268.805 ops/s +# Warmup Iteration 18: 235.852 ops/s +# Warmup Iteration 19: 286.356 ops/s +# Warmup Iteration 20: 284.620 ops/s +Iteration 1: 254.959 ops/s +Iteration 2: 190.810 ops/s +Iteration 3: 246.704 ops/s +Iteration 4: 250.271 ops/s +Iteration 5: 267.229 ops/s +Iteration 6: 231.565 ops/s +Iteration 7: 276.484 ops/s +Iteration 8: 268.814 ops/s +Iteration 9: 266.663 ops/s +Iteration 10: 288.768 ops/s +Iteration 11: 268.739 ops/s +Iteration 12: 248.626 ops/s +Iteration 13: 249.413 ops/s +Iteration 14: 256.208 ops/s +Iteration 15: 287.790 ops/s +Iteration 16: 289.582 ops/s +Iteration 17: 278.557 ops/s +Iteration 18: 259.286 ops/s +Iteration 19: 291.819 ops/s +Iteration 20: 309.163 ops/s + +# Run progress: 90.00% complete, ETA 00:00:57 +# Fork: 2 of 2 +# Warmup Iteration 1: 0.179 ops/s +# Warmup Iteration 2: 50.884 ops/s +# Warmup Iteration 3: 72.350 ops/s +# Warmup Iteration 4: 88.128 ops/s +# Warmup Iteration 5: 115.737 ops/s +# Warmup Iteration 6: 144.979 ops/s +# Warmup Iteration 7: 136.735 ops/s +# Warmup Iteration 8: 123.185 ops/s +# Warmup Iteration 9: 164.147 ops/s +# Warmup Iteration 10: 201.256 ops/s +# Warmup Iteration 11: 194.580 ops/s +# Warmup Iteration 12: 208.549 ops/s +# Warmup Iteration 13: 260.943 ops/s +# Warmup Iteration 14: 260.571 ops/s +# Warmup Iteration 15: 270.563 ops/s +# Warmup Iteration 16: 304.469 ops/s +# Warmup Iteration 17: 305.088 ops/s +# Warmup Iteration 18: 320.412 ops/s +# Warmup Iteration 19: 297.664 ops/s +# Warmup Iteration 20: 304.921 ops/s +Iteration 1: 309.533 ops/s +Iteration 2: 265.964 ops/s +Iteration 3: 259.553 ops/s +Iteration 4: 319.399 ops/s +Iteration 5: 297.845 ops/s +Iteration 6: 314.970 ops/s +Iteration 7: 246.227 ops/s +Iteration 8: 271.487 ops/s +Iteration 9: 285.937 ops/s +Iteration 10: 247.245 ops/s +Iteration 11: 244.618 ops/s +Iteration 12: 276.502 ops/s +Iteration 13: 332.911 ops/s +Iteration 14: 339.844 ops/s +Iteration 15: 319.634 ops/s +Iteration 16: 304.013 ops/s +Iteration 17: 282.037 ops/s +Iteration 18: 208.240 ops/s +Iteration 19: 220.542 ops/s +Iteration 20: 266.379 ops/s + + +Result "metrifier.benchmark.RPCBenchmark.programComposition": + 272.358 ±(99.9%) 18.218 ops/s [Average] + (min, avg, max) = (190.810, 272.358, 339.844), stdev = 32.382 + CI (99.9%): [254.141, 290.576] (assumes normal distribution) + + +# Run complete. Total time: 00:09:32 + +Benchmark Mode Cnt Score Error Units +RPCBenchmark.createPerson thrpt 40 2127.367 ± 230.981 ops/s +RPCBenchmark.getPerson thrpt 40 2859.026 ± 205.242 ops/s +RPCBenchmark.getPersonLinks thrpt 40 1883.806 ± 127.808 ops/s +RPCBenchmark.listPersons thrpt 40 1762.097 ± 161.918 ops/s +RPCBenchmark.programComposition thrpt 40 272.358 ± 18.218 ops/s ``` ## Summary @@ -635,24 +1088,26 @@ See [README](README.md#running-benchmarks) for reference. ### http ```bash -[info] # Run complete. Total time: 00:05:23 -[info] Benchmark Mode Cnt Score Error Units -[info] HttpBenchmark.createPerson thrpt 20 9.178 ± 0.050 ops/s -[info] HttpBenchmark.getPerson thrpt 20 1680.386 ± 577.062 ops/s -[info] HttpBenchmark.getPersonLinks thrpt 20 1349.666 ± 174.447 ops/s -[info] HttpBenchmark.listPersons thrpt 20 1811.600 ± 400.316 ops/s -[info] HttpBenchmark.programComposition thrpt 20 8.492 ± 0.089 ops/s +# Run complete. Total time: 00:08:52 + +Benchmark Mode Cnt Score Error Units +HttpBenchmark.createPerson thrpt 40 861.052 ± 106.109 ops/s +HttpBenchmark.getPerson thrpt 40 1569.770 ± 153.491 ops/s +HttpBenchmark.getPersonLinks thrpt 40 1072.277 ± 131.565 ops/s +HttpBenchmark.listPersons thrpt 40 1196.642 ± 153.626 ops/s +HttpBenchmark.programComposition thrpt 40 156.592 ± 14.936 ops/s ``` ### frees-rpc ```bash -[info] # Run complete. Total time: 00:06:06 -[info] Benchmark Mode Cnt Score Error Units -[info] RPCBenchmark.createPerson thrpt 20 9.298 ± 0.044 ops/s -[info] RPCBenchmark.getPerson thrpt 20 3544.518 ± 970.798 ops/s -[info] RPCBenchmark.getPersonLinks thrpt 20 2708.222 ± 277.988 ops/s -[info] RPCBenchmark.listPersons thrpt 20 3042.332 ± 340.310 ops/s -[info] RPCBenchmark.programComposition thrpt 20 8.755 ± 0.064 ops/s +# Run complete. Total time: 00:09:32 + +Benchmark Mode Cnt Score Error Units +RPCBenchmark.createPerson thrpt 40 2127.367 ± 230.981 ops/s +RPCBenchmark.getPerson thrpt 40 2859.026 ± 205.242 ops/s +RPCBenchmark.getPersonLinks thrpt 40 1883.806 ± 127.808 ops/s +RPCBenchmark.listPersons thrpt 40 1762.097 ± 161.918 ops/s +RPCBenchmark.programComposition thrpt 40 272.358 ± 18.218 ops/s ``` diff --git a/README.md b/README.md index 76b05b2..282f26c 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ We are using the [Java Microbenchmark Harness (JMH)](http://openjdk.java.net/pro * `argonaut`, version `6.2`. * RPC services stack based on: * `freestyle`, version `0.4.1`. - * `frees-rpc`, version `0.1.1` (atop of [gRPC](https://grpc.io/), version `1.6.1`). + * `frees-rpc`, version `0.1.2` (atop of [gRPC](https://grpc.io/), version `1.6.1`). ### http @@ -56,10 +56,10 @@ sbt "http/runMain metrifier.http.server.HttpServer" * Run Benchmarks: ```bash -sbt "bench/jmh:run -i 10 -wi 10 -f 2 -t 1 metrifier.benchmark.HttpBenchmark" +sbt "bench/jmh:run -o http-benchmark-results.txt -i 20 -wi 20 -f 2 -t 1 metrifier.benchmark.HttpBenchmark" ``` -Which means "10 iterations", "10 warmup iterations", "2 forks", "1 thread". +Which means "20 iterations", "20 warmup iterations", "2 forks", "1 thread". ### frees-rpc @@ -72,10 +72,10 @@ sbt "frees-rpc/runMain metrifier.rpc.server.RPCServer" * Run Benchmarks: ```bash -sbt "bench/jmh:run -i 10 -wi 10 -f 2 -t 1 metrifier.benchmark.RPCBenchmark" +sbt "bench/jmh:run -o rpc-benchmark-results.txt -i 20 -wi 20 -f 2 -t 1 metrifier.benchmark.RPCBenchmark" ``` -Which means "10 iterations", "10 warmup iterations", "2 forks", "1 thread". +Which means "20 iterations", "20 warmup iterations", "2 forks", "1 thread". ### Benchmark Results @@ -97,24 +97,27 @@ Expanded version is in the [BENCHMARK_RESULTS.md](BENCHMARK_RESULTS.md) file. * HttpBenchmark Raw output: ```bash -[info] # Run complete. Total time: 00:05:23 -[info] Benchmark Mode Cnt Score Error Units -[info] HttpBenchmark.createPerson thrpt 20 9.178 ± 0.050 ops/s -[info] HttpBenchmark.getPerson thrpt 20 1680.386 ± 577.062 ops/s -[info] HttpBenchmark.getPersonLinks thrpt 20 1349.666 ± 174.447 ops/s -[info] HttpBenchmark.listPersons thrpt 20 1811.600 ± 400.316 ops/s -[info] HttpBenchmark.programComposition thrpt 20 8.492 ± 0.089 ops/s +# Run complete. Total time: 00:08:52 + +Benchmark Mode Cnt Score Error Units +HttpBenchmark.createPerson thrpt 40 861.052 ± 106.109 ops/s +HttpBenchmark.getPerson thrpt 40 1569.770 ± 153.491 ops/s +HttpBenchmark.getPersonLinks thrpt 40 1072.277 ± 131.565 ops/s +HttpBenchmark.listPersons thrpt 40 1196.642 ± 153.626 ops/s +HttpBenchmark.programComposition thrpt 40 156.592 ± 14.936 ops/s ``` + * RPCBenchmark Raw output: ```bash -[info] # Run complete. Total time: 00:06:06 -[info] Benchmark Mode Cnt Score Error Units -[info] RPCBenchmark.createPerson thrpt 20 9.298 ± 0.044 ops/s -[info] RPCBenchmark.getPerson thrpt 20 3544.518 ± 970.798 ops/s -[info] RPCBenchmark.getPersonLinks thrpt 20 2708.222 ± 277.988 ops/s -[info] RPCBenchmark.listPersons thrpt 20 3042.332 ± 340.310 ops/s -[info] RPCBenchmark.programComposition thrpt 20 8.755 ± 0.064 ops/s +# Run complete. Total time: 00:09:32 + +Benchmark Mode Cnt Score Error Units +RPCBenchmark.createPerson thrpt 40 2127.367 ± 230.981 ops/s +RPCBenchmark.getPerson thrpt 40 2859.026 ± 205.242 ops/s +RPCBenchmark.getPersonLinks thrpt 40 1883.806 ± 127.808 ops/s +RPCBenchmark.listPersons thrpt 40 1762.097 ± 161.918 ops/s +RPCBenchmark.programComposition thrpt 40 272.358 ± 18.218 ops/s ``` ##### Summary @@ -123,40 +126,46 @@ Expanded version is in the [BENCHMARK_RESULTS.md](BENCHMARK_RESULTS.md) file. Source | Mode | Cnt | Score | Error | Units --- | --- | --- | --- | --- | --- -HttpBenchmark.createPerson | thrpt | 20 | 9.178 | 0.050 | ops/s -RPCBenchmark.createPerson | thrpt | 20 | 9.298 | 0.044 | ops/s +HttpBenchmark.createPerson | thrpt | 40 | 861.052 | 106.109 | ops/s +RPCBenchmark.createPerson | thrpt | 40 | 2127.367 | 230.981 | ops/s ###### **getPerson** Source | Mode | Cnt | Score | Error | Units --- | --- | --- | --- | --- | --- -HttpBenchmark.getPerson | thrpt | 20 | 1680.386 | 577.062 | ops/s -RPCBenchmark.getPerson | thrpt | 20 | 3544.518 | 970.798 | ops/s +HttpBenchmark.getPerson | thrpt | 40 | 1569.770 | 153.491 | ops/s +RPCBenchmark.getPerson | thrpt | 40 | 2859.026 | 205.242 | ops/s ###### **getPersonLinks** Source | Mode | Cnt | Score | Error | Units --- | --- | --- | --- | --- | --- -HttpBenchmark.getPersonLinks | thrpt | 20 | 1349.666 | 174.447 | ops/s -RPCBenchmark.getPersonLinks | thrpt | 20 | 2708.222 | 277.988 | ops/s +HttpBenchmark.getPersonLinks | thrpt | 40 | 1072.277 | 131.565 | ops/s +RPCBenchmark.getPersonLinks | thrpt | 40 | 1883.806 | 127.808 | ops/s ###### **listPersons** Source | Mode | Cnt | Score | Error | Units --- | --- | --- | --- | --- | --- -HttpBenchmark.listPersons | thrpt | 20 | 1811.600 | 400.316 | ops/s -RPCBenchmark.listPersons | thrpt | 20 | 3042.332 | 340.310 | ops/s +HttpBenchmark.listPersons | thrpt | 40 | 1196.642 | 153.626 | ops/s +RPCBenchmark.listPersons | thrpt | 40 | 1762.097 | 161.918 | ops/s ###### **programComposition** Source | Mode | Cnt | Score | Error | Units --- | --- | --- | --- | --- | --- -HttpBenchmark.programComposition | thrpt | 20 | 8.492 | 0.089 | ops/s -RPCBenchmark.programComposition | thrpt | 20 | 8.755 | 0.064 | ops/s +HttpBenchmark.programComposition | thrpt | 40 | 156.592 | 14.936 | ops/s +RPCBenchmark.programComposition | thrpt | 40 | 272.358 | 18.218 | ops/s + +##### Comparing both in Charts + +You can find the following charts in [this jsfiddle](http://jsfiddle.net/juanpedromoreno/sjw5jgrj/). -##### Comparing both in a Radar Chart +* Bar Chart +![bar-chart-bench](chart-bar.png) -![bench](radar-chart.png) +* Radar Chart +![radar-chart-bench](chart-radar.png) #### Conclusion diff --git a/bench/src/main/scala/RPCBenchmark.scala b/bench/src/main/scala/RPCBenchmark.scala index 97d5461..c8121db 100644 --- a/bench/src/main/scala/RPCBenchmark.scala +++ b/bench/src/main/scala/RPCBenchmark.scala @@ -1,14 +1,12 @@ package metrifier package benchmark -import freestyle._ -import freestyle.implicits._ import org.openjdk.jmh.annotations._ -import metrifier.rpc.client.RPCClient import metrifier.shared.model._ import metrifier.benchmark.rpc.implicits._ import java.util.concurrent.TimeUnit +import metrifier.rpc.protocols.PersonService import monix.eval.Task import scala.concurrent.duration.Duration @@ -19,84 +17,56 @@ import scala.concurrent.Await @OutputTimeUnit(TimeUnit.SECONDS) class RPCBenchmark { - @Benchmark - def listPersons: PersonList = { - - def program[M[_]](implicit APP: RPCClient[M]): FreeS[M, PersonList] = APP.listPersons - - Await.result(program[RPCClient.Op].interpret[Task].runAsync, Duration.Inf) - } + val client: PersonService.Client[Task] = implicitly[PersonService.Client[Task]] + val p5: Person = Person( + id = "5", + name = PersonName(title = "ms", first = "valentine", last = "lacroix"), + gender = "female", + location = Location( + street = "1494 avenue du fort-caire", + city = "orléans", + state = "aveyron", + postCode = 91831), + email = "valentine.lacroix@example.com", + picture = None + ) @Benchmark - def getPerson: Person = { - - def program[M[_]](implicit APP: RPCClient[M]): FreeS[M, Person] = APP.getPerson("1") - - Await.result(program[RPCClient.Op].interpret[Task].runAsync, Duration.Inf) - } + def listPersons: PersonList = Await.result(client.listPersons("foo").runAsync, Duration.Inf) @Benchmark - def getPersonLinks: PersonLinkList = { - - def program[M[_]](implicit APP: RPCClient[M]): FreeS[M, PersonLinkList] = APP.getPersonLinks("1") - - Await.result(program[RPCClient.Op].interpret[Task].runAsync, Duration.Inf) - } + def getPerson: Person = Await.result(client.getPerson("1").runAsync, Duration.Inf) @Benchmark - def createPerson: Person = { + def getPersonLinks: PersonLinkList = + Await.result(client.getPersonLinks("1").runAsync, Duration.Inf) - def program[M[_]](implicit APP: RPCClient[M]): FreeS[M, Person] = - APP.createPerson( - id = "5", - nameTitle = "ms", - nameFirst = "valentine", - nameLast = "lacroix", - gender = "female", - locationStreet = "1494 avenue du fort-caire", - locationCity = "orléans", - locationState = "aveyron", - locationPostCode = 91831, - email = "valentine.lacroix@example.com", - pictureLarge = None, - pictureMedium = None, - pictureThumbnail = None - ) - - Await.result(program[RPCClient.Op].interpret[Task].runAsync, Duration.Inf) - } + @Benchmark + def createPerson: Person = + Await.result( + client + .createPerson(p5) + .runAsync, + Duration.Inf + ) @Benchmark def programComposition: PersonAggregation = { - def program[M[_]](implicit APP: RPCClient[M]): FreeS[M, PersonAggregation] = { + def clientProgram: Task[PersonAggregation] = { for { - personList <- APP.listPersons - p1 <- APP.getPerson("1") - p2 <- APP.getPerson("2") - p3 <- APP.getPerson("3") - p4 <- APP.getPerson("4") - p1Links <- APP.getPersonLinks(p1.id) - p3Links <- APP.getPersonLinks(p3.id) - pNew <- APP.createPerson( - id = "5", - nameTitle = "ms", - nameFirst = "valentine", - nameLast = "lacroix", - gender = "female", - locationStreet = "1494 avenue du fort-caire", - locationCity = "orléans", - locationState = "aveyron", - locationPostCode = 91831, - email = "valentine.lacroix@example.com", - pictureLarge = None, - pictureMedium = None, - pictureThumbnail = None - ) + personList <- client.listPersons("foo") + p1 <- client.getPerson("1") + p2 <- client.getPerson("2") + p3 <- client.getPerson("3") + p4 <- client.getPerson("4") + p1Links <- client.getPersonLinks(p1.id) + p3Links <- client.getPersonLinks(p3.id) + pNew <- client.createPerson(p5) } yield (p1, p2, p3, p4, p1Links, p3Links, personList.add(pNew)) } - Await.result(program[RPCClient.Op].interpret[Task].runAsync, Duration.Inf) + Await.result(clientProgram.runAsync, Duration.Inf) } } diff --git a/bench/src/main/scala/rpc/rpc.scala b/bench/src/main/scala/rpc/rpc.scala index 59f2c53..47c65d4 100644 --- a/bench/src/main/scala/rpc/rpc.scala +++ b/bench/src/main/scala/rpc/rpc.scala @@ -1,14 +1,13 @@ package metrifier package benchmark -import cats.implicits._ import freestyle.implicits._ import freestyle.asyncCatsEffect.implicits._ import freestyle.rpc.client._ +import freestyle.rpc.client.implicits._ import monix.eval.Task import io.grpc.ManagedChannel import metrifier.rpc._ -import metrifier.rpc.client._ import metrifier.rpc.protocols._ import scala.concurrent.Future @@ -32,9 +31,6 @@ package object rpc { implicit val personServiceClient: PersonService.Client[Task] = PersonService.client[Task](channel) - - implicit val rpcClientHandler: RPCClientHandler[Task] = - new RPCClientHandler[Task] } object implicits extends Implicits diff --git a/chart-bar.png b/chart-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..a1fe437bdb746391b15bfae8afc7a8068660640f GIT binary patch literal 33402 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 pc70=Lefq$k0p&iYsbTf)bcQ*q_!*JgL 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 z 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 z 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 LI%);iE&cxwlxM - Picture(pl, pictureMedium.getOrElse(""), pictureThumbnail.getOrElse(""))) - - val p: Person = Person( - id = id, - name = PersonName(title = nameTitle, first = nameFirst, last = nameLast), - gender = gender, - location = Location( - street = locationStreet, - city = locationStreet, - state = locationState, - postCode = locationPostCode), - email = email, - picture = picture - ) - - client.createPerson(p) - } - -} diff --git a/frees-rpc/src/main/scala/rpc.scala b/frees-rpc/src/main/scala/rpc.scala index 3cb1f00..c914b9a 100644 --- a/frees-rpc/src/main/scala/rpc.scala +++ b/frees-rpc/src/main/scala/rpc.scala @@ -1,11 +1,7 @@ package metrifier package rpc -import cats.{Comonad, ~>} -import monix.eval.Task - -import scala.concurrent.{Await, ExecutionContext, Future} -import scala.concurrent.duration._ +import scala.concurrent.ExecutionContext trait PersonServiceEC { @@ -15,36 +11,4 @@ trait PersonServiceEC { } -trait FutureInstances extends freestyle.rpc.client.FutureInstances { - - protected val atMostDuration: FiniteDuration = 10.seconds - - implicit def futureComonad(implicit ec: ExecutionContext): Comonad[Future] = - new Comonad[Future] { - def extract[A](x: Future[A]): A = { - Await.result(x, atMostDuration) - } - - override def coflatMap[A, B](fa: Future[A])(f: (Future[A]) => B): Future[B] = Future(f(fa)) - - override def map[A, B](fa: Future[A])(f: (A) => B): Future[B] = - fa.map(f) - } - - implicit val future2Task: Future ~> Task = - new (Future ~> Task) { - override def apply[A](fa: Future[A]): Task[A] = { - Task.deferFuture(fa) - } - } -} - -trait TaskInstances { - - implicit val task2Task: Task ~> Task = new (Task ~> Task) { - override def apply[A](fa: Task[A]): Task[A] = fa - } - -} - -trait PersonServiceRuntime extends PersonServiceEC with FutureInstances with TaskInstances +trait PersonServiceRuntime extends PersonServiceEC diff --git a/frees-rpc/src/main/scala/server/PersonServiceHandler.scala b/frees-rpc/src/main/scala/server/PersonServiceHandler.scala deleted file mode 100644 index 0feedd3..0000000 --- a/frees-rpc/src/main/scala/server/PersonServiceHandler.scala +++ /dev/null @@ -1,28 +0,0 @@ -package metrifier -package rpc -package server - -import freestyle.Capture -import metrifier.shared.model._ -import metrifier.shared.services -import protocols._ - -class PersonServiceHandler[F[_]](implicit C: Capture[F]) extends PersonService.Handler[F] { - - override def listPersons(b: String): F[PersonList] = C.capture { - services.listPersons - } - - override def getPerson(id: String): F[Person] = C.capture { - services.getPerson(id) - } - - override def getPersonLinks(id: String): F[PersonLinkList] = C.capture { - services.getPersonLinks(id) - } - - override def createPerson(person: Person): F[Person] = C.capture { - services.createPerson(person) - } - -} diff --git a/frees-rpc/src/main/scala/server/package.scala b/frees-rpc/src/main/scala/server/package.scala index 45b7576..bb646b0 100644 --- a/frees-rpc/src/main/scala/server/package.scala +++ b/frees-rpc/src/main/scala/server/package.scala @@ -6,6 +6,8 @@ import cats.implicits._ import freestyle.implicits._ import freestyle.config.implicits._ import freestyle.rpc.server._ +import metrifier.shared.model.{Person, PersonLinkList, PersonList} +import metrifier.shared.services import protocols.PersonService import scala.concurrent.Future @@ -32,7 +34,21 @@ package object server { import freestyle.rpc.server.implicits._ implicit val personServiceHandler: PersonService.Handler[Future] = - new PersonServiceHandler[Future] + new PersonService.Handler[Future] { + + override def listPersons(b: String): Future[PersonList] = + Future.successful(services.listPersons) + + override def getPerson(id: String): Future[Person] = + Future.successful(services.getPerson(id)) + + override def getPersonLinks(id: String): Future[PersonLinkList] = + Future.successful(services.getPersonLinks(id)) + + override def createPerson(person: Person): Future[Person] = + Future.successful(services.createPerson(person)) + + } val grpcConfigs: List[GrpcConfig] = List( AddService(PersonService.bindService[PersonService.Op, Future]) diff --git a/project/ProjectPlugin.scala b/project/ProjectPlugin.scala index 0fb4705..331e568 100644 --- a/project/ProjectPlugin.scala +++ b/project/ProjectPlugin.scala @@ -9,7 +9,7 @@ object ProjectPlugin extends AutoPlugin { lazy val V = new { lazy val frees = "0.4.1" - lazy val freesRPC = "0.1.1" + lazy val freesRPC = "0.1.2" lazy val http4sV = "0.15.12a" lazy val argonautV = "6.2" lazy val argonautShapelessV = "1.2.0-M5" diff --git a/project/build.properties b/project/build.properties index 017bb86..ed16fb7 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version = 1.0.2 +sbt.version = 1.0.3 diff --git a/radar-chart.png b/radar-chart.png deleted file mode 100644 index 0515d833ce6477c85ed9ea009cf021239a864a5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40103 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 diff --git a/shared/src/main/scala/services.scala b/shared/src/main/scala/services.scala index 08daf55..353b7ca 100644 --- a/shared/src/main/scala/services.scala +++ b/shared/src/main/scala/services.scala @@ -18,9 +18,5 @@ object services { PersonLinkList(search, search.size) } - def createPerson(person: Person): Person = { - // Simulating a IO blocking, it just sleep 100 ms - Thread.sleep(100) - person - } + def createPerson(person: Person): Person = person }