You came to this page from the summary. The page is auto-generated by the Makefile at 2025-07-04 01:41.

package org.eolang.benchmark;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.stream.Collector;
import java.util.stream.LongStream;
import java.util.stream.Stream;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 5, time = 100, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 100, timeUnit = TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
@Fork(2)
public class Big {
    private static final Object[] VALUES = LongStream.range(0L, 10_000_000L)
        .boxed()
        .map(x -> String.format("%04x", x))
        .toArray();
    @Benchmark
    public long plain() {
        long acc = 0L;
        for (int idx = 0; idx < Big.VALUES.length; idx++) {
            final String str = ((String) Big.VALUES[idx]).trim();
            if (str.length() != 4) {
                continue;
            }
            acc += Long.parseLong(str, 16) + 1L;
        }
        return acc;
    }
    @Benchmark
    public long streams() {
        return Stream.of(Big.VALUES)
            .map(obj -> (String) obj)
            .map(String::trim)
            .filter(str -> str.length() == 4)
            .map(str -> Long.parseLong(str, 16) + 1L)
            .mapToLong(num -> num)
            .sum();
    }
    @Benchmark
    public long prefused() {
        return Stream.of(Big.VALUES)
            .collect(col(
                (BiConsumer<ArrayList<String>, Object>) (acc, item) -> {
                    final String i = step1(item);
                    acc.add(i);
                }
            ))
            .stream()
            .collect(col(
                (BiConsumer<ArrayList<String>, String>) (acc, item) -> {
                    final String i = step2(item);
                    acc.add(i);
                }
            ))
            .stream()
            .collect(col(
                (BiConsumer<ArrayList<String>, String>) (acc, item) -> {
                    final String i = item;
                    if (!step3(i)) {
                        return;
                    }
                    acc.add(i);
                }
            ))
            .stream()
            .collect(col(
                (BiConsumer<ArrayList<Long>, String>) (acc, item) -> {
                    final long i = step4(item);
                    acc.add(i);
                }
            ))
            .stream()
            .mapToLong(num -> num)
            .sum();
    }
    @Benchmark
    public long fused1() {
        return Stream.of(Big.VALUES)
            .collect(col(
                (BiConsumer<ArrayList<String>, Object>) (acc, item) -> {
                    final String i = step2(step1(item));
                    acc.add(i);
                }
            ))
            .stream()
            .collect(col(
                (BiConsumer<ArrayList<String>, String>) (acc, item) -> {
                    final String i = item;
                    if (!step3(i)) {
                        return;
                    }
                    acc.add(i);
                }
            ))
            .stream()
            .collect(col(
                (BiConsumer<ArrayList<Long>, String>) (acc, item) -> {
                    final long i = step4(item);
                    acc.add(i);
                }
            ))
            .stream()
            .mapToLong(num -> num)
            .sum();
    }
    @Benchmark
    public long fused2() {
        return Stream.of(Big.VALUES)
            .collect(col(
                (BiConsumer<ArrayList<String>, Object>) (acc, item) -> {
                    final String i = step2(step1(item));
                    if (!step3(i)) {
                        return;
                    }
                    acc.add(i);
                }
            ))
            .stream()
            .collect(col(
                (BiConsumer<ArrayList<Long>, String>) (acc, item) -> {
                    final long i = step4(item);
                    acc.add(i);
                }
            ))
            .stream()
            .mapToLong(num -> num)
            .sum();
    }
    @Benchmark
    public long fused3() {
        return Stream.of(Big.VALUES)
            .collect(col(
                (BiConsumer<ArrayList<Long>, Object>) (acc, item) -> {
                    final String i = step2(step1(item));
                    if (!step3(i)) {
                        return;
                    }
                    final long i2 = step4(i);
                    acc.add(i2);
                }
            ))
            .stream()
            .mapToLong(num -> num)
            .sum();
    }
    private static String step1(final Object item) {
        return (String) item;
    }
    private static String step2(final String item) {
        return item.trim();
    }
    private static boolean step3(final String item) {
        return item.length() == 4;
    }
    private static long step4(final String item) {
        return Long.parseLong(item, 16) + 1L;
    }
    private static <T, R> Collector<T, ArrayList<R>, ArrayList<R>> col(
        BiConsumer<ArrayList<R>, T> fn
    ) {
        return Collector.of(
            () -> new ArrayList<>(0),
            fn,
            (left, right) -> {
                left.addAll(right);
                return left;
            }
        );
    }
}