-
Notifications
You must be signed in to change notification settings - Fork 743
[GH-2307]point geography bench #2307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 1 commit
070a326
1674e50
4832860
6884012
0c14f77
2d529df
0979206
0537f03
05fea0c
bd867d1
b654848
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,262 @@ | ||
| <!-- | ||
| ~ Licensed to the Apache Software Foundation (ASF) under one | ||
| ~ or more contributor license agreements. See the NOTICE file | ||
| ~ distributed with this work for additional information | ||
| ~ regarding copyright ownership. The ASF licenses this file | ||
| ~ to you under the Apache License, Version 2.0 (the | ||
| ~ "License"); you may not use this file except in compliance | ||
| ~ with the License. You may obtain a copy of the License at | ||
| ~ | ||
| ~ http://www.apache.org/licenses/LICENSE-2.0 | ||
| ~ | ||
| ~ Unless required by applicable law or agreed to in writing, | ||
| ~ software distributed under the License is distributed on an | ||
| ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
| ~ KIND, either express or implied. See the License for the | ||
| ~ specific language governing permissions and limitations | ||
| ~ under the License. | ||
| --> | ||
|
|
||
| <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||
| <modelVersion>4.0.0</modelVersion> | ||
| <parent> | ||
| <groupId>org.apache.sedona</groupId> | ||
| <artifactId>sedona-parent</artifactId> | ||
| <version>1.8.0-SNAPSHOT</version> | ||
| <relativePath>../pom.xml</relativePath> | ||
| </parent> | ||
| <artifactId>geographyBench</artifactId> | ||
|
|
||
| <name>${project.groupId}:${project.artifactId}</name> | ||
| <description>A cluster computing system for processing large-scale spatial data: Common API.</description> | ||
| <url>http://sedona.apache.org/</url> | ||
| <packaging>jar</packaging> | ||
|
|
||
| <properties> | ||
| <maven.deploy.skip>${skip.deploy.common.modules}</maven.deploy.skip> | ||
| <maven.compiler.source>${java.version}</maven.compiler.source> | ||
| <maven.compiler.target>${java.version}</maven.compiler.target> | ||
| <jmh.version>1.37</jmh.version> | ||
| </properties> | ||
|
|
||
| <dependencies> | ||
| <dependency> | ||
| <groupId>org.apache.sedona</groupId> | ||
| <artifactId>sedona-common</artifactId> | ||
| <version>${project.version}</version> | ||
| <exclusions> | ||
| <exclusion> | ||
| <groupId>com.fasterxml.jackson.core</groupId> | ||
| <artifactId>*</artifactId> | ||
| </exclusion> | ||
| <exclusion> | ||
| <groupId>it.geosolutions.jaiext.jiffle</groupId> | ||
| <artifactId>*</artifactId> | ||
| </exclusion> | ||
| <exclusion> | ||
| <groupId>org.codehaus.janino</groupId> | ||
| <artifactId>*</artifactId> | ||
| </exclusion> | ||
| </exclusions> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.apache.sedona</groupId> | ||
| <artifactId>sedona-spark-common-${spark.compat.version}_${scala.compat.version}</artifactId> | ||
| <version>${project.version}</version> | ||
| </dependency> | ||
| <!-- JMH --> | ||
| <dependency> | ||
| <groupId>org.openjdk.jmh</groupId> | ||
| <artifactId>jmh-core</artifactId> | ||
| <version>${jmh.version}</version> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.openjdk.jmh</groupId> | ||
| <artifactId>jmh-generator-annprocess</artifactId> | ||
| <version>${jmh.version}</version> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.apache.commons</groupId> | ||
| <artifactId>commons-math3</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.slf4j</groupId> | ||
| <artifactId>slf4j-api</artifactId> | ||
| <!-- THIS IS A FIX --> | ||
| <scope>compile</scope> | ||
| </dependency> | ||
| <!-- THIS IS THE OTHER PART OF THE FIX --> | ||
| <dependency> | ||
| <groupId>org.slf4j</groupId> | ||
| <artifactId>slf4j-simple</artifactId> | ||
| <version>1.7.32</version> <!-- Or any recent version --> | ||
|
||
| <scope>runtime</scope> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.geotools</groupId> | ||
| <artifactId>gt-main</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.geotools</groupId> | ||
| <artifactId>gt-referencing</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.geotools</groupId> | ||
| <artifactId>gt-epsg-hsql</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.geotools</groupId> | ||
| <artifactId>gt-geotiff</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.geotools</groupId> | ||
| <artifactId>gt-arcgrid</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.geotools</groupId> | ||
| <artifactId>gt-process-feature</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.locationtech.jts</groupId> | ||
| <artifactId>jts-core</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.wololo</groupId> | ||
| <artifactId>jts2geojson</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.locationtech.spatial4j</groupId> | ||
| <artifactId>spatial4j</artifactId> | ||
| </dependency> | ||
| <!-- org.datasyslab:s2-geometry-library is a fork of com.google.geometry:s2-geometry-library--> | ||
| <!-- as implementation requirements of apache sedona issue link: --> | ||
| <!-- https://github.com/apache/sedona/issues/1996 --> | ||
| <dependency> | ||
| <groupId>org.datasyslab</groupId> | ||
| <artifactId>s2-geometry-library</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>com.uber</groupId> | ||
| <artifactId>h3</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>com.esotericsoftware</groupId> | ||
| <artifactId>kryo</artifactId> | ||
| <scope>compile</scope> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>net.sf.geographiclib</groupId> | ||
| <artifactId>GeographicLib-Java</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>com.github.ben-manes.caffeine</groupId> | ||
| <artifactId>caffeine</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>it.geosolutions.jaiext.jiffle</groupId> | ||
| <artifactId>jt-jiffle-language</artifactId> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>edu.ucar</groupId> | ||
| <artifactId>cdm-core</artifactId> | ||
| </dependency> | ||
| <!-- For shading a janino package that works with Spark for jiffle. We don't add this to | ||
| dependencyManagement in parent pom.xml because we don't want to mess up with the | ||
| janino versions required by Spark. --> | ||
| <dependency> | ||
| <groupId>org.codehaus.janino</groupId> | ||
| <artifactId>janino</artifactId> | ||
| <version>${janino-version}</version> | ||
| </dependency> | ||
| <dependency> | ||
| <groupId>org.apache.sedona</groupId> | ||
| <artifactId>sedona-common</artifactId> | ||
| <version>1.8.0-SNAPSHOT</version> | ||
| <scope>compile</scope> | ||
| </dependency> | ||
ZhuochengShang marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| </dependencies> | ||
| <build> | ||
| <sourceDirectory>src/jmh/java</sourceDirectory> | ||
| <plugins> | ||
| <plugin> | ||
| <groupId>org.apache.maven.plugins</groupId> | ||
| <artifactId>maven-compiler-plugin</artifactId> | ||
| <configuration> | ||
| <source>11</source> | ||
| <target>11</target> | ||
| </configuration> | ||
| </plugin> | ||
| <plugin> | ||
| <!-- Skip running resolved-pom-maven-plugin since shade will | ||
| generate dependency reduced pom which substitutes property | ||
| values. resolved-pom-maven-plugin will break pom | ||
| installation when working with maven-shade-plugin. --> | ||
| <groupId>io.paradoxical</groupId> | ||
| <artifactId>resolved-pom-maven-plugin</artifactId> | ||
| <version>1.0</version> | ||
| <executions> | ||
| <execution> | ||
| <id>resolve-my-pom</id> | ||
| <phase>none</phase> | ||
| </execution> | ||
| </executions> | ||
| </plugin> | ||
| <plugin> | ||
| <!-- | ||
| We need to shade jiffle and its antlr and janino dependencies for the following reasons: | ||
|
|
||
| 1. Databricks runtime uses an older version of janino (3.0.16) that does not work | ||
| with jiffle in Spark repl. See https://github.com/apache/sedona/discussions/1945 | ||
|
|
||
| 2. Spark 4 uses an incompatible version of antlr at runtime. | ||
| --> | ||
| <groupId>org.apache.maven.plugins</groupId> | ||
| <artifactId>maven-shade-plugin</artifactId> | ||
| <executions> | ||
| <execution> | ||
| <phase>package</phase> | ||
| <goals> | ||
| <goal>shade</goal> | ||
| </goals> | ||
| <configuration> | ||
| <transformers> | ||
| <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> | ||
| <mainClass>org.openjdk.jmh.Main</mainClass> | ||
| </transformer> | ||
| </transformers> | ||
| <relocations> | ||
| <relocation> | ||
| <pattern>it.geosolutions.jaiext.jiffle</pattern> | ||
| <shadedPattern>org.apache.sedona.shaded.jiffle</shadedPattern> | ||
| <excludes> | ||
| <exclude>it.geosolutions.jaiext.jiffle.runtime.*</exclude> | ||
| </excludes> | ||
| </relocation> | ||
| <relocation> | ||
| <pattern>org.antlr.v4.runtime</pattern> | ||
| <shadedPattern>org.apache.sedona.shaded.antlr</shadedPattern> | ||
| </relocation> | ||
| <relocation> | ||
| <pattern>org.codehaus</pattern> | ||
| <shadedPattern>org.apache.sedona.shaded.codehaus</shadedPattern> | ||
| </relocation> | ||
| </relocations> | ||
| <filters> | ||
| <!-- filter to address "Invalid signature file" issue - see http://stackoverflow.com/a/6743609/589215 --> | ||
| <filter> | ||
| <artifact>*:*</artifact> | ||
| <excludes> | ||
| <exclude>META-INF/*.SF</exclude> | ||
| <exclude>META-INF/*.DSA</exclude> | ||
| <exclude>META-INF/*.RSA</exclude> | ||
| </excludes> | ||
| </filter> | ||
| </filters> | ||
| </configuration> | ||
| </execution> | ||
| </executions> | ||
| </plugin> | ||
| </plugins> | ||
| </build> | ||
| </project> | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,109 @@ | ||
| /* | ||
| * Licensed to the Apache Software Foundation (ASF) under one | ||
| * or more contributor license agreements. See the NOTICE file | ||
| * distributed with this work for additional information | ||
| * regarding copyright ownership. The ASF licenses this file | ||
| * to you under the Apache License, Version 2.0 (the | ||
| * "License"); you may not use this file except in compliance | ||
| * with the License. You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, | ||
| * software distributed under the License is distributed on an | ||
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
| * KIND, either express or implied. See the License for the | ||
| * specific language governing permissions and limitations | ||
| * under the License. | ||
| */ | ||
| package org.apache.sedona.bench; | ||
|
|
||
| import java.util.Locale; | ||
| import java.util.concurrent.TimeUnit; | ||
| import org.apache.sedona.common.S2Geography.Geography; | ||
| import org.apache.sedona.common.geography.Constructors; | ||
| import org.openjdk.jmh.annotations.*; | ||
| import org.openjdk.jmh.infra.Blackhole; | ||
|
|
||
| /** | ||
| * JMH benchmark to test the performance of decoding Point and MultiPoint geography types with | ||
| * different dimensions (XY, XYZ, XYZM) and numbers of points from WKT format. | ||
| */ | ||
| @BenchmarkMode(Mode.AverageTime) | ||
| @OutputTimeUnit(TimeUnit.NANOSECONDS) | ||
| @State(Scope.Thread) | ||
| @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) | ||
| @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) | ||
| @Fork(2) | ||
| public class DecodeBenchPoint { | ||
|
|
||
| @Param({"1", "16", "256", "4096"}) | ||
| public int points; | ||
|
|
||
| @Param({"XY", "XYZ", "XYM", "XYZM"}) | ||
| public String dimension; | ||
|
|
||
| private String wktPoint; | ||
| private String wktMultiPoint; | ||
|
|
||
| @Setup(Level.Trial) | ||
| public void setup() { | ||
| // POINT <Z|M|ZM> (...) | ||
| wktPoint = String.format(Locale.ROOT, "POINT%s (%s)", dimToken(dimension), coord(0, dimension)); | ||
|
|
||
| // MULTIPOINT <Z|M|ZM> ((...),(...),...) | ||
| StringBuilder sb = new StringBuilder("MULTIPOINT").append(dimToken(dimension)).append(" ("); | ||
| for (int i = 0; i < points; i++) { | ||
| if (i > 0) sb.append(", "); | ||
| sb.append('(').append(coord(i, dimension)).append(')'); | ||
| } | ||
| sb.append(')'); | ||
| wktMultiPoint = sb.toString(); | ||
| } | ||
|
|
||
| private static String dimToken(String dim) { | ||
| switch (dim) { | ||
| case "XY": | ||
| return ""; | ||
| case "XYZ": | ||
| return " Z"; | ||
| case "XYM": | ||
| return " M"; | ||
| case "XYZM": | ||
| return " ZM"; | ||
| default: | ||
| throw new IllegalArgumentException("Unknown dimension: " + dim); | ||
| } | ||
| } | ||
|
|
||
| // Emit coordinates with small non-zero Z/M to ensure real parsing work | ||
| private static String coord(int i, String dim) { | ||
| double x = i, y = i; | ||
| double z = (i % 11) + 0.25; | ||
| double m = i * 0.1 + 0.5; | ||
| switch (dim) { | ||
| case "XY": | ||
| return String.format(Locale.ROOT, "%.6f %.6f", x, y); | ||
| case "XYZ": | ||
| return String.format(Locale.ROOT, "%.6f %.6f %.6f", x, y, z); | ||
| case "XYM": | ||
| return String.format(Locale.ROOT, "%.6f %.6f %.6f", x, y, m); | ||
| case "XYZM": | ||
| return String.format(Locale.ROOT, "%.6f %.6f %.6f %.6f", x, y, z, m); | ||
| default: | ||
| throw new IllegalArgumentException(dim); | ||
| } | ||
| } | ||
|
|
||
| @Benchmark | ||
| public void decode_point(Blackhole bh) throws Exception { | ||
| Geography g = Constructors.geogFromWKT(wktPoint, 4326); | ||
| bh.consume(g); | ||
| } | ||
|
|
||
| @Benchmark | ||
| public void decode_multipoint(Blackhole bh) throws Exception { | ||
| Geography g = Constructors.geogFromWKT(wktMultiPoint, 4326); | ||
| bh.consume(g); | ||
| } | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are these benchmarks actually benchmarking WKT parsing instead of the decode method of Geography? |
||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.