summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2022-10-19 09:57:23 +0200
committerGitHub <noreply@github.com>2022-10-19 09:57:23 +0200
commitbbbc974870e8388ac62ec090f35530a0bd486e98 (patch)
tree367a12617bfdb919d7c6645ede9010756fb59de7
parent0f2271b74221560e61063c13faf92d141e1991c0 (diff)
parent836c680161d4515f7f83ffc350823d5b58db7096 (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
-rw-r--r--container-core/src/main/java/com/yahoo/container/core/HandlerMetricContextUtil.java3
-rw-r--r--container-core/src/main/java/com/yahoo/jdisc/http/server/jetty/JDiscServerConnector.java8
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/Identifier.java16
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/Point.java33
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/PointBuilder.java10
-rw-r--r--container-core/src/main/java/com/yahoo/metrics/simple/jdisc/SimpleMetricConsumer.java5
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);
}