From e2febbdd8c87394efcd2d09aa5aa72ef40a04a5d Mon Sep 17 00:00:00 2001 From: Carter Kozak Date: Tue, 10 Apr 2018 15:55:35 -0700 Subject: [PATCH 1/2] Remove unnecessary iterator allocation in type handlers HandlerMethodReturnValueHandlerComposite and AbstractMethodMessageHandler iterate using index over collections implementing RandomAccess to avoid unnecessary iterators. --- .../handler/invocation/AbstractMethodMessageHandler.java | 6 ++++-- .../HandlerMethodArgumentResolverComposite.java | 4 +--- .../HandlerMethodReturnValueHandlerComposite.java | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java index 76923a748f7..ead36e33c11 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java @@ -84,7 +84,7 @@ public abstract class AbstractMethodMessageHandler protected final Log logger = LogFactory.getLog(getClass()); - private Collection destinationPrefixes = new ArrayList<>(); + private final List destinationPrefixes = new ArrayList<>(); private final List customArgumentResolvers = new ArrayList<>(4); @@ -428,7 +428,9 @@ public abstract class AbstractMethodMessageHandler if (CollectionUtils.isEmpty(this.destinationPrefixes)) { return destination; } - for (String prefix : this.destinationPrefixes) { + // Avoid unnecessary iterator allocation + for (int i = 0, size = this.destinationPrefixes.size(); i < size; i++) { + String prefix = this.destinationPrefixes.get(i); if (destination.startsWith(prefix)) { return destination.substring(prefix.length()); } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java index f4f7622a06d..5caea7474db 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodArgumentResolverComposite.java @@ -71,9 +71,7 @@ public class HandlerMethodArgumentResolverComposite implements HandlerMethodArgu @Nullable List argumentResolvers) { if (argumentResolvers != null) { - for (HandlerMethodArgumentResolver resolver : argumentResolvers) { - this.argumentResolvers.add(resolver); - } + this.argumentResolvers.addAll(argumentResolvers); } return this; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java index 21f779b9726..c019167daa0 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java @@ -71,9 +71,7 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet @Nullable List handlers) { if (handlers != null) { - for (HandlerMethodReturnValueHandler handler : handlers) { - this.returnValueHandlers.add(handler); - } + this.returnValueHandlers.addAll(handlers); } return this; } @@ -85,7 +83,9 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet @Nullable private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) { - for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) { + // Avoid allocating an iterator + for (int i = 0, size = this.returnValueHandlers.size(); i < size; i++) { + HandlerMethodReturnValueHandler handler = this.returnValueHandlers.get(i); if (handler.supportsReturnType(returnType)) { return handler; } From cca78e42f1d5c8618ab5e077ca49eeed799059fd Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Wed, 11 Apr 2018 21:52:59 -0400 Subject: [PATCH 2/2] Polish --- .../handler/invocation/AbstractMethodMessageHandler.java | 4 ++-- .../HandlerMethodReturnValueHandlerComposite.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java index ead36e33c11..658f4ba0f34 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/AbstractMethodMessageHandler.java @@ -420,6 +420,7 @@ public abstract class AbstractMethodMessageHandler *

If there are no matching prefixes, return {@code null}. *

If there are no destination prefixes, return the destination as is. */ + @SuppressWarnings("ForLoopReplaceableByForEach") @Nullable protected String getLookupDestination(@Nullable String destination) { if (destination == null) { @@ -428,8 +429,7 @@ public abstract class AbstractMethodMessageHandler if (CollectionUtils.isEmpty(this.destinationPrefixes)) { return destination; } - // Avoid unnecessary iterator allocation - for (int i = 0, size = this.destinationPrefixes.size(); i < size; i++) { + for (int i = 0; i < this.destinationPrefixes.size(); i++) { String prefix = this.destinationPrefixes.get(i); if (destination.startsWith(prefix)) { return destination.substring(prefix.length()); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java index c019167daa0..ebc9d204a85 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/HandlerMethodReturnValueHandlerComposite.java @@ -1,5 +1,6 @@ /* - * Copyright 2002-2017 the original author or authors. +/* + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,10 +82,10 @@ public class HandlerMethodReturnValueHandlerComposite implements AsyncHandlerMet return getReturnValueHandler(returnType) != null; } + @SuppressWarnings("ForLoopReplaceableByForEach") @Nullable private HandlerMethodReturnValueHandler getReturnValueHandler(MethodParameter returnType) { - // Avoid allocating an iterator - for (int i = 0, size = this.returnValueHandlers.size(); i < size; i++) { + for (int i = 0; i < this.returnValueHandlers.size(); i++) { HandlerMethodReturnValueHandler handler = this.returnValueHandlers.get(i); if (handler.supportsReturnType(returnType)) { return handler;