From 2fe82bd32af49eb0cac997f8a525f7e59351ab8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Sun, 29 Oct 2023 21:58:53 +0100 Subject: [PATCH 1/4] decent performance improvement --- pom.xml | 7 +++++++ src/main/java/no/hasmac/jsonld/flattening/NodeMap.java | 9 +++++---- .../java/no/hasmac/jsonld/flattening/NodeMapBuilder.java | 8 ++++---- src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java | 3 ++- 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index c36d29e8..4117e1e3 100644 --- a/pom.xml +++ b/pom.xml @@ -18,4 +18,11 @@ 11 src/main/java11 + + + it.unimi.dsi + fastutil + 8.5.12 + + diff --git a/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java b/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java index b761bf56..8b412c66 100644 --- a/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java +++ b/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java @@ -22,6 +22,7 @@ import java.util.Objects; import java.util.Optional; +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import no.hasmac.jsonld.json.JsonProvider; import no.hasmac.jsonld.json.JsonUtils; import no.hasmac.jsonld.lang.Keywords; @@ -36,8 +37,8 @@ public final class NodeMap { private final BlankNodeIdGenerator generator = new BlankNodeIdGenerator(); public NodeMap() { - this.index = new LinkedHashMap<>(); - this.index.put(Keywords.DEFAULT, new LinkedHashMap<>()); + this.index = new Object2ObjectLinkedOpenHashMap<>(2); + this.index.put(Keywords.DEFAULT, new Object2ObjectLinkedOpenHashMap<>(1)); } public void set(String graphName, String subject, String property, JsonValue value) { @@ -47,8 +48,8 @@ public void set(String graphName, String subject, String property, JsonValue val } index - .computeIfAbsent(graphName, x -> new LinkedHashMap<>()) - .computeIfAbsent(subject, x -> new LinkedHashMap<>()) + .computeIfAbsent(graphName, x -> new Object2ObjectLinkedOpenHashMap<>()) + .computeIfAbsent(subject, x -> new Object2ObjectLinkedOpenHashMap<>(1)) .put(property, value); } diff --git a/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java b/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java index 1013d01d..c8f88f7d 100644 --- a/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java +++ b/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java @@ -15,6 +15,7 @@ */ package no.hasmac.jsonld.flattening; +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import no.hasmac.jsonld.JsonLdError; import no.hasmac.jsonld.JsonLdErrorCode; import no.hasmac.jsonld.ModifiableJsonArray; @@ -33,7 +34,6 @@ import jakarta.json.JsonValue.ValueType; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -129,7 +129,7 @@ public NodeMap build() throws JsonLdError { } // 2. - final Map elementObject = new LinkedHashMap<>(element.asJsonObject()); + final Map elementObject = new Object2ObjectLinkedOpenHashMap<>(element.asJsonObject()); // 3. if (elementObject.containsKey(Keywords.TYPE)) { @@ -175,7 +175,7 @@ public NodeMap build() throws JsonLdError { // 5. else if (elementObject.containsKey(Keywords.LIST)) { // 5.1. - Map result = new LinkedHashMap<>(); + Map result = new Object2ObjectLinkedOpenHashMap<>(); result.put(Keywords.LIST, JsonValue.EMPTY_JSON_ARRAY); // 5.2. @@ -350,7 +350,7 @@ else if (NodeObject.isNodeObject(element)) { // 6.9. if (elementObject.containsKey(Keywords.REVERSE)) { // 6.9.1. - Map referenced = new LinkedHashMap<>(); + Map referenced = new Object2ObjectLinkedOpenHashMap<>(); referenced.put(Keywords.ID, JsonProvider.instance().createValue(id)); // 6.9.2. diff --git a/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java b/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java index 048c27df..11f3527a 100644 --- a/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java +++ b/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import no.hasmac.rdf.RdfGraph; import no.hasmac.rdf.RdfResource; import no.hasmac.rdf.RdfTriple; @@ -45,7 +46,7 @@ public void add(final RdfTriple triple) { } index - .computeIfAbsent(triple.getSubject(), x -> new HashMap<>(1)) + .computeIfAbsent(triple.getSubject(), x -> new Object2ObjectArrayMap<>(1)) .computeIfAbsent(triple.getPredicate(), x -> new HashSet<>(1)) .add(triple.getObject()); From 1cfd996717a2adc2c19f762ff71f72d4705ebbba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Sun, 29 Oct 2023 22:10:26 +0100 Subject: [PATCH 2/4] some more performance improvement --- src/main/java/no/hasmac/jsonld/flattening/NodeMap.java | 5 +++-- .../java/no/hasmac/jsonld/flattening/NodeMapBuilder.java | 3 ++- src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java | 3 ++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java b/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java index 8b412c66..7509f24d 100644 --- a/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java +++ b/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java @@ -22,6 +22,7 @@ import java.util.Objects; import java.util.Optional; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import no.hasmac.jsonld.json.JsonProvider; import no.hasmac.jsonld.json.JsonUtils; @@ -37,7 +38,7 @@ public final class NodeMap { private final BlankNodeIdGenerator generator = new BlankNodeIdGenerator(); public NodeMap() { - this.index = new Object2ObjectLinkedOpenHashMap<>(2); + this.index = new Object2ObjectArrayMap<>(2); this.index.put(Keywords.DEFAULT, new Object2ObjectLinkedOpenHashMap<>(1)); } @@ -49,7 +50,7 @@ public void set(String graphName, String subject, String property, JsonValue val index .computeIfAbsent(graphName, x -> new Object2ObjectLinkedOpenHashMap<>()) - .computeIfAbsent(subject, x -> new Object2ObjectLinkedOpenHashMap<>(1)) + .computeIfAbsent(subject, x -> new Object2ObjectArrayMap<>(1)) .put(property, value); } diff --git a/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java b/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java index c8f88f7d..7ed64cd9 100644 --- a/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java +++ b/src/main/java/no/hasmac/jsonld/flattening/NodeMapBuilder.java @@ -15,6 +15,7 @@ */ package no.hasmac.jsonld.flattening; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import no.hasmac.jsonld.JsonLdError; import no.hasmac.jsonld.JsonLdErrorCode; @@ -129,7 +130,7 @@ public NodeMap build() throws JsonLdError { } // 2. - final Map elementObject = new Object2ObjectLinkedOpenHashMap<>(element.asJsonObject()); + final Map elementObject = new Object2ObjectArrayMap<>(element.asJsonObject()); // 3. if (elementObject.containsKey(Keywords.TYPE)) { diff --git a/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java b/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java index 11f3527a..2a97d610 100644 --- a/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java +++ b/src/main/java/no/hasmac/rdf/impl/RdfGraphImpl.java @@ -23,6 +23,7 @@ import java.util.Set; import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import no.hasmac.rdf.RdfGraph; import no.hasmac.rdf.RdfResource; import no.hasmac.rdf.RdfTriple; @@ -47,7 +48,7 @@ public void add(final RdfTriple triple) { index .computeIfAbsent(triple.getSubject(), x -> new Object2ObjectArrayMap<>(1)) - .computeIfAbsent(triple.getPredicate(), x -> new HashSet<>(1)) + .computeIfAbsent(triple.getPredicate(), x -> new ObjectOpenHashSet<>(1)) .add(triple.getObject()); triples.add(triple); From c470abcad5a72949a182ebf6d796038a505bdba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Sun, 29 Oct 2023 22:17:58 +0100 Subject: [PATCH 3/4] more performance improvements --- src/main/java/no/hasmac/jsonld/json/JsonMapBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/no/hasmac/jsonld/json/JsonMapBuilder.java b/src/main/java/no/hasmac/jsonld/json/JsonMapBuilder.java index 7d011132..ea2f7e5f 100644 --- a/src/main/java/no/hasmac/jsonld/json/JsonMapBuilder.java +++ b/src/main/java/no/hasmac/jsonld/json/JsonMapBuilder.java @@ -20,6 +20,7 @@ import java.util.Optional; import java.util.Set; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import no.hasmac.jsonld.lang.Keywords; import jakarta.json.JsonArray; @@ -85,7 +86,7 @@ public static JsonMapBuilder create(Map object) { } public static JsonMapBuilder create() { - return new JsonMapBuilder(new LinkedHashMap<>()); + return new JsonMapBuilder(new Object2ObjectArrayMap<>()); } public Optional get(String key) { From 4bf417fba3270a742cdc299c7ac2c7b5af6bc653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ha=CC=8Avard=20Ottestad?= Date: Mon, 30 Oct 2023 12:40:58 +0100 Subject: [PATCH 4/4] more performance improvements --- .../hasmac/jsonld/context/InverseContext.java | 14 ++++--- .../no/hasmac/jsonld/flattening/NodeMap.java | 6 +-- .../java/no/hasmac/jsonld/json/JsonUtils.java | 42 +++++++++---------- 3 files changed, 33 insertions(+), 29 deletions(-) diff --git a/src/main/java/no/hasmac/jsonld/context/InverseContext.java b/src/main/java/no/hasmac/jsonld/context/InverseContext.java index 1b39e330..7457b0e6 100644 --- a/src/main/java/no/hasmac/jsonld/context/InverseContext.java +++ b/src/main/java/no/hasmac/jsonld/context/InverseContext.java @@ -15,7 +15,11 @@ */ package no.hasmac.jsonld.context; -import java.util.LinkedHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + import java.util.Map; import java.util.Optional; @@ -24,13 +28,13 @@ public final class InverseContext { private final Map>>> context; public InverseContext() { - this.context = new LinkedHashMap<>(); + this.context = new Object2ObjectOpenHashMap<>(); } private void set(final String variable, final String container, final String type, final String key, final String value) { - context.computeIfAbsent(variable, x -> new LinkedHashMap<>()) - .computeIfAbsent(container, x -> new LinkedHashMap<>()) - .computeIfAbsent(type, x -> new LinkedHashMap<>()) + context.computeIfAbsent(variable, x -> new Object2ObjectOpenHashMap<>()) + .computeIfAbsent(container, x -> new Object2ObjectOpenHashMap<>()) + .computeIfAbsent(type, x -> new Object2ObjectLinkedOpenHashMap<>()) .put(key, value); } diff --git a/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java b/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java index 7509f24d..4a63380c 100644 --- a/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java +++ b/src/main/java/no/hasmac/jsonld/flattening/NodeMap.java @@ -38,8 +38,8 @@ public final class NodeMap { private final BlankNodeIdGenerator generator = new BlankNodeIdGenerator(); public NodeMap() { - this.index = new Object2ObjectArrayMap<>(2); - this.index.put(Keywords.DEFAULT, new Object2ObjectLinkedOpenHashMap<>(1)); + this.index = new Object2ObjectArrayMap<>(1); + this.index.put(Keywords.DEFAULT, new LinkedHashMap<>()); } public void set(String graphName, String subject, String property, JsonValue value) { @@ -49,7 +49,7 @@ public void set(String graphName, String subject, String property, JsonValue val } index - .computeIfAbsent(graphName, x -> new Object2ObjectLinkedOpenHashMap<>()) + .computeIfAbsent(graphName, x -> new LinkedHashMap<>()) .computeIfAbsent(subject, x -> new Object2ObjectArrayMap<>(1)) .put(property, value); } diff --git a/src/main/java/no/hasmac/jsonld/json/JsonUtils.java b/src/main/java/no/hasmac/jsonld/json/JsonUtils.java index efaec28b..6cef475b 100644 --- a/src/main/java/no/hasmac/jsonld/json/JsonUtils.java +++ b/src/main/java/no/hasmac/jsonld/json/JsonUtils.java @@ -15,13 +15,13 @@ */ package no.hasmac.jsonld.json; -import no.hasmac.jsonld.StringUtils; import jakarta.json.JsonArray; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; import jakarta.json.JsonString; import jakarta.json.JsonValue; import jakarta.json.JsonValue.ValueType; +import no.hasmac.jsonld.StringUtils; import java.util.Collection; import java.util.Collections; @@ -79,7 +79,7 @@ public static boolean isNotScalar(final JsonValue value) { } public static boolean isNull(final JsonValue value) { - return value == null || ValueType.NULL.equals(value.getValueType()); + return value == null || ValueType.NULL == value.getValueType(); } public static boolean isNotNull(final JsonValue value) { @@ -87,49 +87,49 @@ public static boolean isNotNull(final JsonValue value) { } public static boolean isString(JsonValue value) { - return value != null && ValueType.STRING.equals(value.getValueType()); + return value != null && ValueType.STRING == value.getValueType(); } public static boolean isNotString(JsonValue value) { - return value == null || !ValueType.STRING.equals(value.getValueType()); + return value == null || ValueType.STRING != value.getValueType(); } public static boolean isNotArray(JsonValue value) { - return value == null || !ValueType.ARRAY.equals(value.getValueType()); + return value == null || ValueType.ARRAY != value.getValueType(); } public static boolean isArray(JsonValue value) { - return value != null && ValueType.ARRAY.equals(value.getValueType()); + return value != null && ValueType.ARRAY == value.getValueType(); } public static boolean isObject(JsonValue value) { - return value != null && ValueType.OBJECT.equals(value.getValueType()); + return value != null && ValueType.OBJECT == value.getValueType(); } public static boolean isNotObject(JsonValue value) { - return value == null || !ValueType.OBJECT.equals(value.getValueType()); + return value == null || ValueType.OBJECT != value.getValueType(); } public static boolean isNumber(JsonValue value) { - return value != null && ValueType.NUMBER.equals(value.getValueType()); + return value != null && ValueType.NUMBER == value.getValueType(); } public static boolean isNotBoolean(JsonValue value) { return value == null - || (!ValueType.TRUE.equals(value.getValueType()) - && !ValueType.FALSE.equals(value.getValueType())); + || ValueType.TRUE != value.getValueType() + && ValueType.FALSE != value.getValueType(); } public static boolean isNotNumber(JsonValue value) { - return value == null || !ValueType.NUMBER.equals(value.getValueType()); + return value == null || ValueType.NUMBER != value.getValueType(); } public static boolean isTrue(JsonValue value) { - return value != null && ValueType.TRUE.equals(value.getValueType()); + return value != null && ValueType.TRUE == value.getValueType(); } public static boolean isFalse(JsonValue value) { - return value != null && ValueType.FALSE.equals(value.getValueType()); + return value != null && ValueType.FALSE == value.getValueType(); } public static boolean isEmptyObject(JsonValue value) { @@ -143,15 +143,15 @@ public static boolean isEmptyArray(JsonValue value) { public static JsonObject toJsonObject(Map map) { final JsonObjectBuilder builder = JsonProvider.instance().createObjectBuilder(); - map.entrySet().forEach(e -> builder.add(e.getKey(), e.getValue())); + map.forEach(builder::add); return builder.build(); } public static JsonObject merge(JsonObject target, JsonObject source) { - Map targetMap = (new LinkedHashMap<>(target)); + Map targetMap = new LinkedHashMap<>(target); - source.forEach(targetMap::put); + targetMap.putAll(source); return toJsonObject(targetMap); } @@ -162,7 +162,7 @@ public static Collection toCollection(JsonValue value) { return Collections.emptyList(); } - if (JsonValue.ValueType.ARRAY.equals(value.getValueType())) { + if (JsonValue.ValueType.ARRAY == value.getValueType()) { return value.asJsonArray(); } @@ -175,7 +175,7 @@ public static Stream toStream(JsonValue value) { return Stream.empty(); } - if (JsonValue.ValueType.ARRAY.equals(value.getValueType())) { + if (JsonValue.ValueType.ARRAY == value.getValueType()) { return value.asJsonArray().stream(); } @@ -232,7 +232,7 @@ public static JsonValue flatten(JsonValue value, String key) { } public static void withStrings(JsonValue value, Consumer addContainerMapping) { - if (JsonValue.ValueType.ARRAY.equals(value.getValueType())) { + if (JsonValue.ValueType.ARRAY == value.getValueType()) { JsonArray asJsonArray = value.asJsonArray(); for (int i = 0, asJsonArraySize = asJsonArray.size(); i < asJsonArraySize; i++) { @@ -248,7 +248,7 @@ public static void withStrings(JsonValue value, Consumer addContainerMap } public static List optimizedGetStrings(JsonValue value) { - if (JsonValue.ValueType.ARRAY.equals(value.getValueType())) { + if (JsonValue.ValueType.ARRAY == value.getValueType()) { JsonArray jsonArray = value.asJsonArray(); if (jsonArray.isEmpty()) { return List.of();