diff --git a/spring-cloud-gateway-server/pom.xml b/spring-cloud-gateway-server/pom.xml
index e6e8f502..ac540872 100644
--- a/spring-cloud-gateway-server/pom.xml
+++ b/spring-cloud-gateway-server/pom.xml
@@ -170,6 +170,17 @@
junit-jupiter
test
+
+ org.openjdk.jmh
+ jmh-core
+ 1.20
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.20
+ provided
+
diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java
index e9772fc3..32ea2ce8 100644
--- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java
+++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/handler/predicate/PathRoutePredicateFactory.java
@@ -34,6 +34,7 @@ import org.springframework.web.util.pattern.PathPatternParser;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_MATCHED_PATH_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_MATCHED_PATH_ROUTE_ID_ATTR;
+import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_PATH_CONTAINER_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_PREDICATE_ROUTE_ATTR;
import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.putUriTemplateVariables;
import static org.springframework.http.server.PathContainer.parsePath;
@@ -89,7 +90,12 @@ public class PathRoutePredicateFactory extends AbstractRoutePredicateFactory> predicates;
+
+ private static String PATH_PATTERN_PREFIX;
+
+ private final static String HOST = "http://localhost:8080";
+
+ private final static int ROUTES_NUM = 2000;
+
+ static {
+ predicates = new LinkedList<>();
+ PATH_PATTERN_PREFIX = String.format("/%s/%s/", RandomStringUtils.random(20, true, false),
+ RandomStringUtils.random(10, true, false));
+ for (int i = 0; i < ROUTES_NUM; i++) {
+ PathRoutePredicateFactory.Config config = new PathRoutePredicateFactory.Config()
+ .setPatterns(Collections.singletonList(PATH_PATTERN_PREFIX + i)).setMatchTrailingSlash(true);
+ Predicate predicate = new PathRoutePredicateFactory().apply(config);
+ predicates.add(predicate);
+ }
+ }
+
+ @Benchmark
+ @Threads(2)
+ @Fork(2)
+ @BenchmarkMode(Mode.All)
+ @Warmup(iterations = 1, time = 3)
+ @Measurement(iterations = 10, time = 1)
+ public void testPathContainerAttr() {
+ Random random = new Random();
+ MockServerHttpRequest request = MockServerHttpRequest
+ .get(HOST + PATH_PATTERN_PREFIX + random.nextInt(ROUTES_NUM)).build();
+ MockServerWebExchange exchange = MockServerWebExchange.from(request);
+ for (Predicate predicate : predicates) {
+ if (predicate.test(exchange)) {
+ break;
+ }
+ }
+ }
+
+}