Dockerfile

📅 2023-05-25T17:06:26.143Z
👁️ 123 katselukertaa
🔓 Julkinen


#!/usr/bin/env -S sh -e -x -c 'DOCKER_BUILDKIT=1 docker build -t gcfperf . && docker run --rm gcfperf'
FROM eclipse-temurin:17 as jre-build

RUN $JAVA_HOME/bin/jlink \
         --add-modules java.base,jdk.compiler \
         --strip-debug \
         --no-man-pages \
         --no-header-files \
         --compress=2 \
         --output /javaruntime

FROM debian:buster-slim
ENV JAVA_HOME=/opt/java/openjdk
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-build /javaruntime $JAVA_HOME

RUN mkdir /opt/app
COPY <<-"EOF" /opt/app/GcfPerf.java
    import java.util.*;

    public class GcfPerf {
        public static int GCF1(int a, int b) {
            return (b == 0) ? a : GCF1(b, a % b);
        }

        public static int GCF2(int a, int b) {
            int copy;
            while (b != 0) {
                copy = a;
                a = b;
                b = copy % b;
            }

            return a;
        }

        public static void main(final String[] args) {
            final Random random = new Random();
            var stats = new Object() {
                private long start;
                private final HashMap<String, LongSummaryStatistics> map = new HashMap<>();

                void start() {
                    start = System.nanoTime();
                }

                void end(final String key) {
                    map.computeIfAbsent(key, k -> new LongSummaryStatistics()).accept(System.nanoTime() - start);
                }

                @Override
                public String toString() {
                    final StringBuilder sb = new StringBuilder("Stats:\n");
                    map.forEach((key, value) -> sb.append("    %s min. %03d ns, avg. %.3f ns, max. %07d ns"
                       .formatted(key, value.getMin(), value.getAverage(), value.getMax())).append("\n"));

                    return sb.toString();
                }
            };

            for (int i = 0; i < 1_000_000; i++) {
                stats.start(); GCF1(random.nextInt(), random.nextInt()); stats.end("GCF1");
                stats.start(); GCF2(random.nextInt(), random.nextInt()); stats.end("GCF2");
            }

            System.err.println(stats);
        }
    }
EOF
CMD ["java", "/opt/app/GcfPerf.java"]