diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2022-10-19 09:57:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-19 09:57:23 +0200 |
commit | bbbc974870e8388ac62ec090f35530a0bd486e98 (patch) | |
tree | 367a12617bfdb919d7c6645ede9010756fb59de7 | |
parent | 0f2271b74221560e61063c13faf92d141e1991c0 (diff) | |
parent | 836c680161d4515f7f83ffc350823d5b58db7096 (diff) |
Merge pull request #24497 from vespa-engine/balder/precompute-hashcode-as-it-will-always-be-used-atleast-once
Balder/precompute hashcode as it will always be used atleast once
6 files changed, 22 insertions, 53 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java b/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java index 5077ef3e849..b7a5732561f 100644 --- a/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java +++ b/container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java @@ -5,7 +5,6 @@ import com.yahoo.jdisc.Metric; import com.yahoo.jdisc.Request; import com.yahoo.jdisc.application.BindingMatch; import com.yahoo.jdisc.application.UriPattern; -import com.yahoo.jdisc.handler.ResponseHandler; import java.net.URI; import java.util.HashMap; @@ -39,7 +38,7 @@ public class HandlerMetricContextUtil { String name = matched.toString(); String endpoint = request.headers().containsKey("Host") ? request.headers().get("Host").get(0) : null; - Map<String, String> dimensions = new HashMap<>(); + Map<String, String> dimensions = new HashMap<>(extraDimensions.size() + 5); dimensions.put("handler", name); if (endpoint != null) { dimensions.put("endpoint", endpoint); diff --git a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java index 49db22c3e38..b3069a64821 100644 --- a/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java +++ b/container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java @@ -41,7 +41,7 @@ class JDiscServerConnector extends ServerConnector { this.metric = metric; this.connectorName = config.name(); this.listenPort = config.listenPort(); - this.metricCtx = metric.createContext(createConnectorDimensions(listenPort, connectorName)); + this.metricCtx = metric.createContext(createConnectorDimensions(listenPort, connectorName, 0)); this.statistics = new ConnectionStatistics(); addBean(statistics); @@ -81,7 +81,7 @@ class JDiscServerConnector extends ServerConnector { String method = request.getMethod(); String scheme = request.getScheme(); boolean clientAuthenticated = request.getAttribute(RequestUtils.SERVLET_REQUEST_X509CERT) != null; - Map<String, Object> dimensions = createConnectorDimensions(listenPort, connectorName); + Map<String, Object> dimensions = createConnectorDimensions(listenPort, connectorName, extraDimensions.size() + 5); dimensions.put(MetricDefinitions.METHOD_DIMENSION, method); dimensions.put(MetricDefinitions.SCHEME_DIMENSION, scheme); dimensions.put(MetricDefinitions.CLIENT_AUTHENTICATED_DIMENSION, Boolean.toString(clientAuthenticated)); @@ -104,8 +104,8 @@ class JDiscServerConnector extends ServerConnector { return listenPort; } - private static Map<String, Object> createConnectorDimensions(int listenPort, String connectorName) { - Map<String, Object> props = new HashMap<>(); + private static Map<String, Object> createConnectorDimensions(int listenPort, String connectorName, int reservedSize) { + Map<String, Object> props = new HashMap<>(reservedSize + 2); props.put(MetricDefinitions.NAME_DIMENSION, connectorName); props.put(MetricDefinitions.PORT_DIMENSION, listenPort); return props; diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/Identifier.java b/container-core/src/main/java/com/yahoo/metrics/simple/Identifier.java index ead7d1c88ca..ba0ee582fd6 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/Identifier.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/Identifier.java @@ -12,19 +12,17 @@ public class Identifier { private final String name; private final Point location; + private final int hashCode; public Identifier(String name, Point location) { this.name = (name == null ? "" : name); this.location = (location == null ? Point.emptyPoint() : location); + this.hashCode = this.location.hashCode() * 31 + this.name.hashCode(); } @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + location.hashCode(); - result = prime * result + name.hashCode(); - return result; + return hashCode; } @Override @@ -34,13 +32,7 @@ public class Identifier { if (getClass() != obj.getClass()) return false; Identifier other = (Identifier) obj; - if (!location.equals(other.location)) { - return false; - } - if (!name.equals(other.name)) { - return false; - } - return true; + return location.equals(other.location) && name.equals(other.name); } @Override diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/Point.java b/container-core/src/main/java/com/yahoo/metrics/simple/Point.java index f9ea3849ddc..7c4cac13693 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/Point.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/Point.java @@ -6,7 +6,6 @@ import java.util.List; import java.util.Map; import com.yahoo.api.annotations.Beta; -import com.google.common.collect.ImmutableList; import com.yahoo.collections.Tuple2; import com.yahoo.jdisc.Metric.Context; @@ -20,6 +19,7 @@ public final class Point implements Context { private final Value[] location; private final String[] dimensions; + private final int hashCode; public Point(Map<String, ?> properties) { this(buildParameters(properties)); @@ -38,6 +38,7 @@ public final class Point implements Context { Point(String[] dimensions, Value[] location) { this.dimensions = dimensions; this.location = location; + this.hashCode = Arrays.hashCode(location) * 31 + Arrays.hashCode(dimensions); } private static final Point theEmptyPoint = new Point(new String[0], new Value[0]); @@ -58,32 +59,16 @@ public final class Point implements Context { @Override public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; Point other = (Point) obj; - if (!Arrays.equals(dimensions, other.dimensions)) { - return false; - } - if (!Arrays.equals(location, other.location)) { - return false; - } - return true; + return Arrays.equals(dimensions, other.dimensions) && Arrays.equals(location, other.location); } @Override public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Arrays.hashCode(dimensions); - result = prime * result + Arrays.hashCode(location); - return result; + return hashCode; } @Override @@ -102,14 +87,14 @@ public final class Point implements Context { * Get an immutable list view of the values for each dimension. */ public List<Value> location() { - return ImmutableList.copyOf(location); + return List.of(location); } /** * Get an immutable list view of the names of each dimension. */ public List<String> dimensions() { - return ImmutableList.copyOf(dimensions); + return List.of(dimensions); } /** diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/PointBuilder.java b/container-core/src/main/java/com/yahoo/metrics/simple/PointBuilder.java index 47061eba10b..a107bea3168 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/PointBuilder.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/PointBuilder.java @@ -27,18 +27,12 @@ public final class PointBuilder { } PointBuilder(Point p) { - dimensions = new ArrayList<>(); - location = new ArrayList<>(); if (p != null) { int size = p.dimensionality(); dimensions = new ArrayList<>(size+2); location = new ArrayList<>(size+2); - for (String dimensionName : p.getDimensions()) { - dimensions.add(dimensionName); - } - for (Value dimensionValue : p.getLocation()) { - location.add(dimensionValue); - } + Collections.addAll(dimensions, p.getDimensions()); + Collections.addAll(location, p.getLocation()); } else { dimensions = new ArrayList<>(4); location = new ArrayList<>(4); diff --git a/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java b/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java index bea17bd91bc..0286684c34c 100644 --- a/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java +++ b/container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java @@ -1,7 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.metrics.simple.jdisc; -import java.util.HashMap; import java.util.Map; import com.yahoo.jdisc.Metric.Context; @@ -46,8 +45,8 @@ public class SimpleMetricConsumer implements MetricConsumer { @Override public Context createContext(Map<String, ?> properties) { - if (properties == null) - properties = new HashMap<>(); + if ((properties == null) || properties.isEmpty()) + return Point.emptyPoint(); return new Point(properties); } |