Start writing about iterators

This commit is contained in:
kageru 2020-04-11 17:53:13 +02:00
parent 1cac5bdeb9
commit b4225d50e0
3 changed files with 839 additions and 0 deletions

765
wip/benchmark.log Normal file
View File

@ -0,0 +1,765 @@
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.Java.loop
# Run progress: 0.00% complete, ETA 01:23:20
# Fork: 1 of 5
# Warmup Iteration 1: 503.008 ms/op
# Warmup Iteration 2: 497.339 ms/op
# Warmup Iteration 3: 497.504 ms/op
# Warmup Iteration 4: 526.782 ms/op
# Warmup Iteration 5: 515.432 ms/op
Iteration 1: 501.527 ms/op
Iteration 2: 499.508 ms/op
Iteration 3: 498.462 ms/op
Iteration 4: 492.443 ms/op
Iteration 5: 497.703 ms/op
# Run progress: 2.00% complete, ETA 01:24:21
# Fork: 2 of 5
# Warmup Iteration 1: 498.714 ms/op
# Warmup Iteration 2: 494.639 ms/op
# Warmup Iteration 3: 494.410 ms/op
# Warmup Iteration 4: 496.832 ms/op
# Warmup Iteration 5: 528.760 ms/op
Iteration 1: 495.342 ms/op
Iteration 2: 498.370 ms/op
Iteration 3: 495.366 ms/op
Iteration 4: 496.939 ms/op
Iteration 5: 496.600 ms/op
# Run progress: 4.00% complete, ETA 01:22:57
# Fork: 3 of 5
# Warmup Iteration 1: 510.115 ms/op
# Warmup Iteration 2: 502.292 ms/op
# Warmup Iteration 3: 503.220 ms/op
# Warmup Iteration 4: 500.617 ms/op
# Warmup Iteration 5: 514.586 ms/op
Iteration 1: 511.165 ms/op
Iteration 2: 494.087 ms/op
Iteration 3: 494.140 ms/op
Iteration 4: 494.629 ms/op
Iteration 5: 497.200 ms/op
# Run progress: 6.00% complete, ETA 01:20:56
# Fork: 4 of 5
# Warmup Iteration 1: 513.161 ms/op
# Warmup Iteration 2: 495.656 ms/op
# Warmup Iteration 3: 494.638 ms/op
# Warmup Iteration 4: 490.464 ms/op
# Warmup Iteration 5: 500.923 ms/op
Iteration 1: 496.505 ms/op
Iteration 2: 493.417 ms/op
Iteration 3: 497.258 ms/op
Iteration 4: 503.422 ms/op
Iteration 5: 496.757 ms/op
# Run progress: 8.00% complete, ETA 01:19:13
# Fork: 5 of 5
# Warmup Iteration 1: 508.611 ms/op
# Warmup Iteration 2: 497.342 ms/op
# Warmup Iteration 3: 515.634 ms/op
# Warmup Iteration 4: 496.081 ms/op
# Warmup Iteration 5: 501.787 ms/op
Iteration 1: 495.476 ms/op
Iteration 2: 511.040 ms/op
Iteration 3: 494.175 ms/op
Iteration 4: 493.056 ms/op
Iteration 5: 497.224 ms/op
Result "perf.Java.loop":
497.672 ±(99.9%) 3.576 ms/op [Average]
(min, avg, max) = (492.443, 497.672, 511.165), stdev = 4.773
CI (99.9%): [494.097, 501.248] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.Java.stream
# Run progress: 10.00% complete, ETA 01:17:30
# Fork: 1 of 5
# Warmup Iteration 1: 752.945 ms/op
# Warmup Iteration 2: 655.457 ms/op
# Warmup Iteration 3: 656.324 ms/op
# Warmup Iteration 4: 659.984 ms/op
# Warmup Iteration 5: 653.979 ms/op
Iteration 1: 702.193 ms/op
Iteration 2: 658.415 ms/op
Iteration 3: 684.926 ms/op
Iteration 4: 679.830 ms/op
Iteration 5: 682.021 ms/op
# Run progress: 12.00% complete, ETA 01:15:56
# Fork: 2 of 5
# Warmup Iteration 1: 751.638 ms/op
# Warmup Iteration 2: 663.695 ms/op
# Warmup Iteration 3: 663.717 ms/op
# Warmup Iteration 4: 667.699 ms/op
# Warmup Iteration 5: 657.080 ms/op
Iteration 1: 657.204 ms/op
Iteration 2: 669.600 ms/op
Iteration 3: 661.893 ms/op
Iteration 4: 658.053 ms/op
Iteration 5: 677.995 ms/op
# Run progress: 14.00% complete, ETA 01:14:17
# Fork: 3 of 5
# Warmup Iteration 1: 753.697 ms/op
# Warmup Iteration 2: 662.388 ms/op
# Warmup Iteration 3: 665.430 ms/op
# Warmup Iteration 4: 656.421 ms/op
# Warmup Iteration 5: 660.469 ms/op
Iteration 1: 726.873 ms/op
Iteration 2: 675.244 ms/op
Iteration 3: 664.811 ms/op
Iteration 4: 656.496 ms/op
Iteration 5: 655.133 ms/op
# Run progress: 16.00% complete, ETA 01:12:41
# Fork: 4 of 5
# Warmup Iteration 1: 758.258 ms/op
# Warmup Iteration 2: 658.559 ms/op
# Warmup Iteration 3: 653.749 ms/op
# Warmup Iteration 4: 676.368 ms/op
# Warmup Iteration 5: 653.075 ms/op
Iteration 1: 694.018 ms/op
Iteration 2: 663.863 ms/op
Iteration 3: 654.269 ms/op
Iteration 4: 657.201 ms/op
Iteration 5: 682.597 ms/op
# Run progress: 18.00% complete, ETA 01:11:04
# Fork: 5 of 5
# Warmup Iteration 1: 755.350 ms/op
# Warmup Iteration 2: 673.888 ms/op
# Warmup Iteration 3: 655.083 ms/op
# Warmup Iteration 4: 658.737 ms/op
# Warmup Iteration 5: 657.309 ms/op
Iteration 1: 671.508 ms/op
Iteration 2: 673.933 ms/op
Iteration 3: 654.189 ms/op
Iteration 4: 654.793 ms/op
Iteration 5: 658.981 ms/op
Result "perf.Java.stream":
671.042 ±(99.9%) 13.278 ms/op [Average]
(min, avg, max) = (654.189, 671.042, 726.873), stdev = 17.726
CI (99.9%): [657.763, 684.320] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.Kotlin.loop
# Run progress: 20.00% complete, ETA 01:09:23
# Fork: 1 of 5
# Warmup Iteration 1: 501.288 ms/op
# Warmup Iteration 2: 519.426 ms/op
# Warmup Iteration 3: 506.916 ms/op
# Warmup Iteration 4: 494.905 ms/op
# Warmup Iteration 5: 495.065 ms/op
Iteration 1: 505.477 ms/op
Iteration 2: 499.944 ms/op
Iteration 3: 502.763 ms/op
Iteration 4: 494.921 ms/op
Iteration 5: 491.712 ms/op
# Run progress: 22.00% complete, ETA 01:07:35
# Fork: 2 of 5
# Warmup Iteration 1: 519.974 ms/op
# Warmup Iteration 2: 495.087 ms/op
# Warmup Iteration 3: 493.488 ms/op
# Warmup Iteration 4: 503.083 ms/op
# Warmup Iteration 5: 494.544 ms/op
Iteration 1: 498.104 ms/op
Iteration 2: 494.670 ms/op
Iteration 3: 494.472 ms/op
Iteration 4: 496.515 ms/op
Iteration 5: 500.076 ms/op
# Run progress: 24.00% complete, ETA 01:05:49
# Fork: 3 of 5
# Warmup Iteration 1: 502.969 ms/op
# Warmup Iteration 2: 515.297 ms/op
# Warmup Iteration 3: 500.498 ms/op
# Warmup Iteration 4: 504.327 ms/op
# Warmup Iteration 5: 495.414 ms/op
Iteration 1: 492.781 ms/op
Iteration 2: 499.457 ms/op
Iteration 3: 497.536 ms/op
Iteration 4: 506.625 ms/op
Iteration 5: 488.861 ms/op
# Run progress: 26.00% complete, ETA 01:04:02
# Fork: 4 of 5
# Warmup Iteration 1: 499.845 ms/op
# Warmup Iteration 2: 500.112 ms/op
# Warmup Iteration 3: 500.099 ms/op
# Warmup Iteration 4: 502.852 ms/op
# Warmup Iteration 5: 495.422 ms/op
Iteration 1: 520.156 ms/op
Iteration 2: 493.320 ms/op
Iteration 3: 510.862 ms/op
Iteration 4: 497.780 ms/op
Iteration 5: 480.626 ms/op
# Run progress: 28.00% complete, ETA 01:02:15
# Fork: 5 of 5
# Warmup Iteration 1: 507.837 ms/op
# Warmup Iteration 2: 501.298 ms/op
# Warmup Iteration 3: 496.518 ms/op
# Warmup Iteration 4: 499.621 ms/op
# Warmup Iteration 5: 506.226 ms/op
Iteration 1: 492.717 ms/op
Iteration 2: 491.870 ms/op
Iteration 3: 523.607 ms/op
Iteration 4: 496.943 ms/op
Iteration 5: 492.535 ms/op
Result "perf.Kotlin.loop":
498.573 ±(99.9%) 6.962 ms/op [Average]
(min, avg, max) = (480.626, 498.573, 523.607), stdev = 9.294
CI (99.9%): [491.611, 505.535] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.Kotlin.stream
# Run progress: 40.00% complete, ETA 00:51:37
# Fork: 1 of 5
# Warmup Iteration 1: 770.439 ms/op
# Warmup Iteration 2: 654.815 ms/op
# Warmup Iteration 3: 659.349 ms/op
# Warmup Iteration 4: 663.637 ms/op
# Warmup Iteration 5: 657.116 ms/op
Iteration 1: 658.083 ms/op
Iteration 2: 662.591 ms/op
Iteration 3: 674.376 ms/op
Iteration 4: 656.337 ms/op
Iteration 5: 657.640 ms/op
# Run progress: 42.00% complete, ETA 00:49:56
# Fork: 2 of 5
# Warmup Iteration 1: 769.538 ms/op
# Warmup Iteration 2: 654.025 ms/op
# Warmup Iteration 3: 663.950 ms/op
# Warmup Iteration 4: 661.340 ms/op
# Warmup Iteration 5: 721.330 ms/op
Iteration 1: 654.068 ms/op
Iteration 2: 666.005 ms/op
Iteration 3: 658.865 ms/op
Iteration 4: 657.615 ms/op
Iteration 5: 656.568 ms/op
# Run progress: 44.00% complete, ETA 00:48:14
# Fork: 3 of 5
# Warmup Iteration 1: 773.322 ms/op
# Warmup Iteration 2: 655.102 ms/op
# Warmup Iteration 3: 660.459 ms/op
# Warmup Iteration 4: 656.585 ms/op
# Warmup Iteration 5: 715.147 ms/op
Iteration 1: 654.845 ms/op
Iteration 2: 655.245 ms/op
Iteration 3: 662.457 ms/op
Iteration 4: 664.278 ms/op
Iteration 5: 692.333 ms/op
# Run progress: 46.00% complete, ETA 00:46:32
# Fork: 4 of 5
# Warmup Iteration 1: 751.623 ms/op
# Warmup Iteration 2: 655.612 ms/op
# Warmup Iteration 3: 693.453 ms/op
# Warmup Iteration 4: 652.434 ms/op
# Warmup Iteration 5: 664.927 ms/op
Iteration 1: 655.975 ms/op
Iteration 2: 661.740 ms/op
Iteration 3: 661.267 ms/op
Iteration 4: 656.503 ms/op
Iteration 5: 663.981 ms/op
# Run progress: 48.00% complete, ETA 00:44:51
# Fork: 5 of 5
# Warmup Iteration 1: 755.101 ms/op
# Warmup Iteration 2: 659.349 ms/op
# Warmup Iteration 3: 659.407 ms/op
# Warmup Iteration 4: 697.422 ms/op
# Warmup Iteration 5: 653.759 ms/op
Iteration 1: 654.175 ms/op
Iteration 2: 661.572 ms/op
Iteration 3: 653.442 ms/op
Iteration 4: 668.452 ms/op
Iteration 5: 681.106 ms/op
Result "perf.Kotlin.stream":
661.981 ±(99.9%) 6.825 ms/op [Average]
(min, avg, max) = (653.442, 661.981, 692.333), stdev = 9.111
CI (99.9%): [655.156, 668.805] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.Kotlin.streamWrappedInSequence
# Run progress: 50.00% complete, ETA 00:43:08
# Fork: 1 of 5
# Warmup Iteration 1: 4771.596 ms/op
# Warmup Iteration 2: 4469.354 ms/op
# Warmup Iteration 3: 4503.951 ms/op
# Warmup Iteration 4: 4642.394 ms/op
# Warmup Iteration 5: 4570.822 ms/op
Iteration 1: 4734.829 ms/op
Iteration 2: 4448.201 ms/op
Iteration 3: 4450.036 ms/op
Iteration 4: 4649.510 ms/op
Iteration 5: 4360.084 ms/op
# Run progress: 52.00% complete, ETA 00:41:56
# Fork: 2 of 5
# Warmup Iteration 1: 4827.821 ms/op
# Warmup Iteration 2: 4491.528 ms/op
# Warmup Iteration 3: 4429.582 ms/op
# Warmup Iteration 4: 4616.589 ms/op
# Warmup Iteration 5: 4425.327 ms/op
Iteration 1: 4536.462 ms/op
Iteration 2: 4507.816 ms/op
Iteration 3: 4448.700 ms/op
Iteration 4: 4499.069 ms/op
Iteration 5: 4481.440 ms/op
# Run progress: 54.00% complete, ETA 00:40:38
# Fork: 3 of 5
# Warmup Iteration 1: 5100.392 ms/op
# Warmup Iteration 2: 4510.386 ms/op
# Warmup Iteration 3: 4520.391 ms/op
# Warmup Iteration 4: 4455.398 ms/op
# Warmup Iteration 5: 4438.041 ms/op
Iteration 1: 4463.642 ms/op
Iteration 2: 4513.981 ms/op
Iteration 3: 4451.207 ms/op
Iteration 4: 4592.493 ms/op
Iteration 5: 4558.072 ms/op
# Run progress: 56.00% complete, ETA 00:39:12
# Fork: 4 of 5
# Warmup Iteration 1: 4625.825 ms/op
# Warmup Iteration 2: 4523.034 ms/op
# Warmup Iteration 3: 4642.197 ms/op
# Warmup Iteration 4: 4420.747 ms/op
# Warmup Iteration 5: 4655.348 ms/op
Iteration 1: 4655.329 ms/op
Iteration 2: 4426.920 ms/op
Iteration 3: 4483.991 ms/op
Iteration 4: 4499.432 ms/op
Iteration 5: 4537.659 ms/op
# Run progress: 58.00% complete, ETA 00:37:47
# Fork: 5 of 5
# Warmup Iteration 1: 5112.802 ms/op
# Warmup Iteration 2: 4446.181 ms/op
# Warmup Iteration 3: 4580.273 ms/op
# Warmup Iteration 4: 4410.598 ms/op
# Warmup Iteration 5: 4403.912 ms/op
Iteration 1: 4502.871 ms/op
Iteration 2: 4654.358 ms/op
Iteration 3: 4422.066 ms/op
Iteration 4: 4356.905 ms/op
Iteration 5: 4456.772 ms/op
Result "perf.Kotlin.streamWrappedInSequence":
4507.674 ±(99.9%) 69.124 ms/op [Average]
(min, avg, max) = (4356.905, 4507.674, 4734.829), stdev = 92.279
CI (99.9%): [4438.549, 4576.798] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.Kotlin.withGenerator
# Run progress: 60.00% complete, ETA 00:36:14
# Fork: 1 of 5
# Warmup Iteration 1: 12972.312 ms/op
# Warmup Iteration 2: 11150.766 ms/op
# Warmup Iteration 3: 9243.075 ms/op
# Warmup Iteration 4: 9264.701 ms/op
# Warmup Iteration 5: 11170.115 ms/op
Iteration 1: 9341.833 ms/op
Iteration 2: 9283.496 ms/op
Iteration 3: 9174.673 ms/op
Iteration 4: 9202.388 ms/op
Iteration 5: 9320.724 ms/op
# Run progress: 62.00% complete, ETA 00:35:07
# Fork: 2 of 5
# Warmup Iteration 1: 11221.832 ms/op
# Warmup Iteration 2: 14477.742 ms/op
# Warmup Iteration 3: 9534.827 ms/op
# Warmup Iteration 4: 9291.195 ms/op
# Warmup Iteration 5: 9361.180 ms/op
Iteration 1: 13425.934 ms/op
Iteration 2: 9402.840 ms/op
Iteration 3: 9205.030 ms/op
Iteration 4: 9145.462 ms/op
Iteration 5: 9412.641 ms/op
# Run progress: 64.00% complete, ETA 00:33:49
# Fork: 3 of 5
# Warmup Iteration 1: 11481.680 ms/op
# Warmup Iteration 2: 11080.843 ms/op
# Warmup Iteration 3: 9253.032 ms/op
# Warmup Iteration 4: 9399.855 ms/op
# Warmup Iteration 5: 8943.780 ms/op
Iteration 1: 9482.955 ms/op
Iteration 2: 9124.821 ms/op
Iteration 3: 9198.032 ms/op
Iteration 4: 9194.677 ms/op
Iteration 5: 9252.317 ms/op
# Run progress: 66.00% complete, ETA 00:32:26
# Fork: 4 of 5
# Warmup Iteration 1: 11560.755 ms/op
# Warmup Iteration 2: 10979.804 ms/op
# Warmup Iteration 3: 8778.534 ms/op
# Warmup Iteration 4: 9271.147 ms/op
# Warmup Iteration 5: 8962.573 ms/op
Iteration 1: 8849.864 ms/op
Iteration 2: 8943.724 ms/op
Iteration 3: 8956.114 ms/op
Iteration 4: 8851.836 ms/op
Iteration 5: 8918.313 ms/op
# Run progress: 68.00% complete, ETA 00:30:56
# Fork: 5 of 5
# Warmup Iteration 1: 11657.552 ms/op
# Warmup Iteration 2: 14300.899 ms/op
# Warmup Iteration 3: 9345.045 ms/op
# Warmup Iteration 4: 9167.124 ms/op
# Warmup Iteration 5: 9481.174 ms/op
Iteration 1: 9249.084 ms/op
Iteration 2: 9231.042 ms/op
Iteration 3: 9360.817 ms/op
Iteration 4: 9328.045 ms/op
Iteration 5: 9094.625 ms/op
Result "perf.Kotlin.withGenerator":
9358.051 ±(99.9%) 647.987 ms/op [Average]
(min, avg, max) = (8849.864, 9358.051, 13425.934), stdev = 865.044
CI (99.9%): [8710.065, 10006.038] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.NonPrimitive.parallelStream
# Run progress: 70.00% complete, ETA 00:29:25
# Fork: 1 of 5
# Warmup Iteration 1: 45622.300 ms/op
# Warmup Iteration 2: 51268.916 ms/op
# Warmup Iteration 3: 54557.341 ms/op
# Warmup Iteration 4: 53486.933 ms/op
# Warmup Iteration 5: 49141.534 ms/op
Iteration 1: 48819.449 ms/op
Iteration 2: 49136.332 ms/op
Iteration 3: 50845.214 ms/op
Iteration 4: 49430.190 ms/op
Iteration 5: 48870.124 ms/op
# Run progress: 72.00% complete, ETA 00:29:57
# Fork: 2 of 5
# Warmup Iteration 1: 50170.272 ms/op
# Warmup Iteration 2: 53994.209 ms/op
# Warmup Iteration 3: 53407.886 ms/op
# Warmup Iteration 4: 51364.240 ms/op
# Warmup Iteration 5: 51227.612 ms/op
Iteration 1: 51931.093 ms/op
Iteration 2: 50769.543 ms/op
Iteration 3: 56751.344 ms/op
Iteration 4: 52092.542 ms/op
Iteration 5: 53091.324 ms/op
# Run progress: 74.00% complete, ETA 00:30:08
# Fork: 3 of 5
# Warmup Iteration 1: 49080.774 ms/op
# Warmup Iteration 2: 56156.551 ms/op
# Warmup Iteration 3: 52052.861 ms/op
# Warmup Iteration 4: 55415.614 ms/op
# Warmup Iteration 5: 51782.162 ms/op
Iteration 1: 51509.481 ms/op
Iteration 2: 55253.665 ms/op
Iteration 3: 50771.941 ms/op
Iteration 4: 54707.276 ms/op
Iteration 5: 51359.288 ms/op
# Run progress: 76.00% complete, ETA 00:29:52
# Fork: 4 of 5
# Warmup Iteration 1: 50272.019 ms/op
# Warmup Iteration 2: 57595.569 ms/op
# Warmup Iteration 3: 59850.768 ms/op
# Warmup Iteration 4: 54712.763 ms/op
# Warmup Iteration 5: 53759.817 ms/op
Iteration 1: 55310.711 ms/op
Iteration 2: 52339.983 ms/op
Iteration 3: 53796.593 ms/op
Iteration 4: 51265.637 ms/op
Iteration 5: 51163.343 ms/op
# Run progress: 78.00% complete, ETA 00:29:13
# Fork: 5 of 5
# Warmup Iteration 1: 46287.662 ms/op
# Warmup Iteration 2: 56583.661 ms/op
# Warmup Iteration 3: 54958.161 ms/op
# Warmup Iteration 4: 52485.864 ms/op
# Warmup Iteration 5: 51463.926 ms/op
Iteration 1: 59061.271 ms/op
Iteration 2: 62958.959 ms/op
Iteration 3: 54422.187 ms/op
Iteration 4: 51840.252 ms/op
Iteration 5: 52454.721 ms/op
Result "perf.NonPrimitive.parallelStream":
52798.098 ±(99.9%) 2451.723 ms/op [Average]
(min, avg, max) = (48819.449, 52798.098, 62958.959), stdev = 3272.980
CI (99.9%): [50346.375, 55249.822] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.NonPrimitive.sequence
# Run progress: 80.00% complete, ETA 00:28:09
# Fork: 1 of 5
# Warmup Iteration 1: 31539.028 ms/op
# Warmup Iteration 2: 32167.361 ms/op
# Warmup Iteration 3: 31438.191 ms/op
# Warmup Iteration 4: 31771.676 ms/op
# Warmup Iteration 5: 31476.264 ms/op
Iteration 1: 32394.913 ms/op
Iteration 2: 31534.739 ms/op
Iteration 3: 32371.211 ms/op
Iteration 4: 31587.742 ms/op
Iteration 5: 32116.086 ms/op
# Run progress: 82.00% complete, ETA 00:25:53
# Fork: 2 of 5
# Warmup Iteration 1: 32147.157 ms/op
# Warmup Iteration 2: 31512.206 ms/op
# Warmup Iteration 3: 31765.894 ms/op
# Warmup Iteration 4: 31205.766 ms/op
# Warmup Iteration 5: 32011.824 ms/op
Iteration 1: 31948.070 ms/op
Iteration 2: 35102.995 ms/op
Iteration 3: 31417.171 ms/op
Iteration 4: 31561.729 ms/op
Iteration 5: 31358.093 ms/op
# Run progress: 84.00% complete, ETA 00:23:29
# Fork: 3 of 5
# Warmup Iteration 1: 31004.566 ms/op
# Warmup Iteration 2: 31665.419 ms/op
# Warmup Iteration 3: 31381.758 ms/op
# Warmup Iteration 4: 31739.301 ms/op
# Warmup Iteration 5: 33043.687 ms/op
Iteration 1: 31251.636 ms/op
Iteration 2: 34870.238 ms/op
Iteration 3: 31329.340 ms/op
Iteration 4: 31706.639 ms/op
Iteration 5: 31342.416 ms/op
# Run progress: 86.00% complete, ETA 00:20:56
# Fork: 4 of 5
# Warmup Iteration 1: 31439.350 ms/op
# Warmup Iteration 2: 31796.581 ms/op
# Warmup Iteration 3: 30981.395 ms/op
# Warmup Iteration 4: 31014.350 ms/op
# Warmup Iteration 5: 32090.784 ms/op
Iteration 1: 35625.972 ms/op
Iteration 2: 31931.136 ms/op
Iteration 3: 31184.763 ms/op
Iteration 4: 31694.722 ms/op
Iteration 5: 31880.194 ms/op
# Run progress: 88.00% complete, ETA 00:18:16
# Fork: 5 of 5
# Warmup Iteration 1: 32086.933 ms/op
# Warmup Iteration 2: 31691.944 ms/op
# Warmup Iteration 3: 31720.550 ms/op
# Warmup Iteration 4: 31687.710 ms/op
# Warmup Iteration 5: 31665.377 ms/op
Iteration 1: 31649.628 ms/op
Iteration 2: 31965.411 ms/op
Iteration 3: 31552.680 ms/op
Iteration 4: 31191.134 ms/op
Iteration 5: 31948.312 ms/op
Result "perf.NonPrimitive.sequence":
32100.679 ±(99.9%) 913.441 ms/op [Average]
(min, avg, max) = (31184.763, 32100.679, 35625.972), stdev = 1219.417
CI (99.9%): [31187.238, 33014.120] (assumes normal distribution)
# JMH version: 1.23
# VM version: JDK 15-ea, OpenJDK 64-Bit Server VM, 15-ea+17-717
# VM invoker: /usr/lib/jvm/java-15-openjdk/bin/java
# VM options: <none>
# Warmup: 5 iterations, 10 s each
# Measurement: 5 iterations, 10 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Average time, time/op
# Benchmark: perf.NonPrimitive.stream
# Run progress: 90.00% complete, ETA 00:15:28
# Fork: 1 of 5
# Warmup Iteration 1: 43230.332 ms/op
# Warmup Iteration 2: 50557.338 ms/op
# Warmup Iteration 3: 50822.458 ms/op
# Warmup Iteration 4: 50159.518 ms/op
# Warmup Iteration 5: 50098.131 ms/op
Iteration 1: 50816.292 ms/op
Iteration 2: 50245.734 ms/op
Iteration 3: 50341.716 ms/op
Iteration 4: 50361.851 ms/op
Iteration 5: 50362.410 ms/op
# Run progress: 92.00% complete, ETA 00:12:49
# Fork: 2 of 5
# Warmup Iteration 1: 53187.949 ms/op
# Warmup Iteration 2: 51120.670 ms/op
# Warmup Iteration 3: 51116.071 ms/op
# Warmup Iteration 4: 51517.877 ms/op
# Warmup Iteration 5: 51755.674 ms/op
Iteration 1: 51481.433 ms/op
Iteration 2: 51822.715 ms/op
Iteration 3: 51509.446 ms/op
Iteration 4: 51537.729 ms/op
Iteration 5: 53196.225 ms/op
# Run progress: 94.00% complete, ETA 00:09:58
# Fork: 3 of 5
# Warmup Iteration 1: 43924.846 ms/op
# Warmup Iteration 2: 50782.107 ms/op
# Warmup Iteration 3: 50232.693 ms/op
# Warmup Iteration 4: 49835.131 ms/op
# Warmup Iteration 5: 50901.686 ms/op
Iteration 1: 50166.901 ms/op
Iteration 2: 50617.046 ms/op
Iteration 3: 50144.998 ms/op
Iteration 4: 50044.519 ms/op
Iteration 5: 50792.107 ms/op
# Run progress: 96.00% complete, ETA 00:06:51
# Fork: 4 of 5
# Warmup Iteration 1: 44810.711 ms/op
# Warmup Iteration 2: 51014.134 ms/op
# Warmup Iteration 3: 50839.319 ms/op
# Warmup Iteration 4: 51794.822 ms/op
# Warmup Iteration 5: 51088.069 ms/op
Iteration 1: 51650.679 ms/op
Iteration 2: 51178.894 ms/op
Iteration 3: 51247.988 ms/op
Iteration 4: 50767.387 ms/op
Iteration 5: 50682.972 ms/op
# Run progress: 98.00% complete, ETA 00:03:31
# Fork: 5 of 5
# Warmup Iteration 1: 42961.998 ms/op
# Warmup Iteration 2: 50554.667 ms/op
# Warmup Iteration 3: 49991.236 ms/op
# Warmup Iteration 4: 49157.238 ms/op
# Warmup Iteration 5: 50339.484 ms/op
Iteration 1: 50025.853 ms/op
Iteration 2: 50515.643 ms/op
Iteration 3: 50206.781 ms/op
Iteration 4: 49584.429 ms/op
Iteration 5: 52719.464 ms/op
Result "perf.NonPrimitive.stream":
50880.849 ±(99.9%) 644.167 ms/op [Average]
(min, avg, max) = (49584.429, 50880.849, 53196.225), stdev = 859.945
CI (99.9%): [50236.681, 51525.016] (assumes normal distribution)
# Run complete. Total time: 03:01:10
REMEMBER: The numbers below are just data. To gain reusable insights, you need to follow up on
why the numbers are the way they are. Use profilers (see -prof, -lprof), design factorial
experiments, perform baseline and negative tests that provide experimental control, make sure
the benchmarking environment is safe on JVM/OS/HW level, ask for reviews from the domain experts.
Do not assume the numbers tell you what you want them to tell.
Benchmark Mode Cnt Score Error Units
Java.loop avgt 25 497.672 ± 3.576 ms/op
Java.stream avgt 25 671.042 ± 13.278 ms/op
Kotlin.loop avgt 25 498.573 ± 6.962 ms/op
Kotlin.stream avgt 25 661.981 ± 6.825 ms/op
Kotlin.streamWrappedInSequence avgt 25 4507.674 ± 69.124 ms/op
Kotlin.withGenerator avgt 25 9358.051 ± 647.987 ms/op
NonPrimitive.parallelStream avgt 25 52798.098 ± 2451.723 ms/op
NonPrimitive.sequence avgt 25 32100.679 ± 913.441 ms/op
NonPrimitive.stream avgt 25 50880.849 ± 644.167 ms/op

50
wip/iterators.md Normal file
View File

@ -0,0 +1,50 @@
# Stream, Sequence, Iterator – a story of laziness and sad benchmarking noises
Many programming languages have started to include more functional features in their standard libraries.
One of those features is lazy collections, for lack of a better term,
which seem to have a different name in each language
(we’ll just call them iterators here)
and sometimes vastly differing implementations.
One thing they all have in common, though, is a lack of trust in their performance.
For almost every language out there that offers lazy iterators,
there will be people telling you not to use them for performance reasons,
more often than not without any data to back that up.
I was personally interested in this because, being a Java/Kotlin developer,
I use Java’s Streams and Kotlin’s Sequences almost every day
with relatively little regard for performance.
They are intuitive to write and are easy to reason about,
which is usually much more important than the results of a thousand microbenchmarks,
so please don’t stop using your favorite language feature because it’s 2.8% slower than the primitive alternative.
Still, I wanted to know how they compare to imperative code.
There are some resources on this for Java 8’s Stream API,
but Kotlin’s Sequences seem to just be accepted as
more convenient Streams[^convenience].
Rust is here as a baseline for comparisons
because it is generally regarded as having very optimized iterators.
[^convenience]: If you’ve ever used them, you’ll know what I mean.
Java’s Streams are built in a way that allows for easy parallelism,
but brings its own problems and limitations for the usage.
We’ll see some of that in the code examples later.
## What *is* an iterator?
You can think of an iterator as a pipeline of data.
It’s not a list, so it doesn’t support indexing,
because it doesn’t actually hold any data.
It just contains information on how to get or make that data.
You can make it produce data and use that
(which is often called ‘consuming’ the iterator
because if you read data from the pipeline, it’s usually gone),
or you can add a new step to the pipeline and hand the result to someone else,
who can then consume it or add even more operations.
You also don’t know when (or if at all) an iterator will end.
Someone could sit at the other end and constantly put new data into your pipeline.
An important aspect to note is: adding an operation to the pipeline does nothing
until someone actually starts reading from it,
and even then, only the elements that are consumed are computed.[^inf]
[^inf]: This is what makes infinite iterators possible to begin with.

24
wip/squaresum.s Normal file
View File

@ -0,0 +1,24 @@
example::sum_iter:
cmp rdi, 2
jb .LBB2_1
lea rax, [rdi - 2]
lea rcx, [rdi - 3]
mul rcx
mov r8, rax
mov rsi, rdx
lea rcx, [rdi - 4]
mul rcx
imul ecx, esi
shld rsi, r8, 63
lea rsi, [rsi + 4*rsi]
add edx, ecx
shld rdx, rax, 63
movabs rcx, 6148914691236517206
imul rcx, rdx
lea rax, [rsi + 4*rdi]
add rax, -7
add rax, rcx
ret
.LBB2_1:
xor eax, eax
ret