From 62861828cc4d2c029ffd9139aa018ca52182b07b Mon Sep 17 00:00:00 2001 From: Yegor Bugayenko Date: Thu, 23 Jan 2025 17:10:12 +0300 Subject: [PATCH] bench --- .../lints/errors/LtObjectIsNotUnique.java | 4 +- src/test/java/benchmarks/ProgramBench.java | 4 +- src/test/java/benchmarks/ProgramsBench.java | 85 +++++++++++++++++++ src/test/java/fixtures/LargeXmir.java | 18 +++- 4 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/test/java/benchmarks/ProgramsBench.java diff --git a/src/main/java/org/eolang/lints/errors/LtObjectIsNotUnique.java b/src/main/java/org/eolang/lints/errors/LtObjectIsNotUnique.java index 153da632..086c0dc4 100644 --- a/src/main/java/org/eolang/lints/errors/LtObjectIsNotUnique.java +++ b/src/main/java/org/eolang/lints/errors/LtObjectIsNotUnique.java @@ -119,7 +119,9 @@ private static Map programObjects(final XML xmir) { .collect( Collectors.toMap( names::get, - pos -> xmir.xpath("/program/objects/o/@line").get(pos), + pos -> xmir.xpath( + String.format("/program/objects/o[%d]/@line", pos + 1) + ).stream().findFirst().orElse("0"), (existing, replacement) -> replacement ) ); diff --git a/src/test/java/benchmarks/ProgramBench.java b/src/test/java/benchmarks/ProgramBench.java index 0767aea8..b759842c 100644 --- a/src/test/java/benchmarks/ProgramBench.java +++ b/src/test/java/benchmarks/ProgramBench.java @@ -49,8 +49,8 @@ @Fork(1) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MILLISECONDS) -@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.MILLISECONDS) -@Measurement(iterations = 2, time = 1, timeUnit = TimeUnit.MILLISECONDS) +@Warmup(iterations = 1) +@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.MILLISECONDS) @State(Scope.Benchmark) public class ProgramBench { diff --git a/src/test/java/benchmarks/ProgramsBench.java b/src/test/java/benchmarks/ProgramsBench.java new file mode 100644 index 00000000..4c4f4289 --- /dev/null +++ b/src/test/java/benchmarks/ProgramsBench.java @@ -0,0 +1,85 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2025 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package benchmarks; + +import fixtures.LargeXmir; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.TimeUnit; +import org.cactoos.scalar.IoChecked; +import org.eolang.lints.Program; +import org.eolang.lints.Programs; +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; + +/** + * Benchmark for {@link Program}. + * + * @since 0.0.34 + * @checkstyle DesignForExtensionCheck (10 lines) + * @checkstyle NonStaticMethodCheck (100 lines) + */ +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@Warmup(iterations = 1) +@Measurement(iterations = 3, time = 1, timeUnit = TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class ProgramsBench { + + /** + * Large XMIR document. + */ + private final Path home; + + public ProgramsBench() { + try { + this.home = Files.createTempDirectory("tmp"); + for (int idx = 0; idx < 10; ++idx) { + final String name = String.format("program-%d.xmir", idx); + Files.write( + this.home.resolve(String.format("%s.xmir", name)), + new IoChecked<>(new LargeXmir(name)) + .value().toString().getBytes(StandardCharsets.UTF_8) + ); + } + } catch (final IOException ex) { + throw new IllegalArgumentException(ex); + } + } + + @Benchmark + public final void scansLargeProgram() throws IOException { + new Programs(this.home).defects(); + } +} diff --git a/src/test/java/fixtures/LargeXmir.java b/src/test/java/fixtures/LargeXmir.java index f3098b5d..6b0a0581 100644 --- a/src/test/java/fixtures/LargeXmir.java +++ b/src/test/java/fixtures/LargeXmir.java @@ -33,6 +33,8 @@ import org.cactoos.bytes.BytesOf; import org.cactoos.bytes.UncheckedBytes; import org.cactoos.io.ResourceOf; +import org.xembly.Directives; +import org.xembly.Xembler; /** * Large XMIR document. @@ -41,6 +43,16 @@ */ public final class LargeXmir implements Scalar { + private final String name; + + public LargeXmir() { + this("unknown"); + } + + public LargeXmir(final String nme) { + this.name = nme; + } + @Override public XML value() throws Exception { final Path home = Files.createTempDirectory("tmp"); @@ -76,6 +88,10 @@ public XML value() throws Exception { ); } ); - return ref.get(); + final XML xml = ref.get(); + new Xembler( + new Directives().xpath("/program").attr("name", this.name) + ).apply(xml.inner()); + return xml; } }