Optimize object creation in RequestMappingHandlerMapping#handleNoMatch #29634
Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull request is closed. Suggestions cannot be applied while viewing a subset of changes. Only one suggestion per line can be applied in a batch. Add this suggestion to a batch that can be applied as a single commit. Applying suggestions on deleted lines is not supported. You must change the existing code in this line in order to create a valid suggestion. Outdated suggestions cannot be applied. This suggestion has been applied or marked resolved. Suggestions cannot be applied from pending reviews. Suggestions cannot be applied on multi-line comments. Suggestions cannot be applied while the pull request is queued to merge. Suggestion cannot be applied right now. Please check back later.
related issue: #29611
RequestMappingInfoHandlerMapping
handleNoMatch()method has the following format.https://github.com/spring-projects/spring-framework/blob/main/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java#L246
https://github.com/spring-projects/spring-framework/blob/main/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java#L169
And this method may allow an empty value in
Set<RequestMappingInfo> infosparameter.(Unfortunately, it happens a lot in the service I am running.)
The constructor code of org.springframework.web.reactive.result.method.RequestMappingInfoHandlerMapping.PartialMatchHelper is shown below.
https://github.com/spring-projects/spring-framework/blob/main/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/RequestMappingInfoHandlerMapping.java#L227
This code executes follwoing method even if there is no value in infos
java.util.Collection#streamjava.util.stream.Collectors#toListjava.util.stream.ReferencePipeline#collect(java.util.stream.Collector<? super P_OUT,A,R>)Unnecessary resources are used via these methods.(create objects and execute operations, so )
Even though parameters have values, it seems better not to use Stream.
It can save resources by changing the constructor like mvc's RequestMappingInfoHandlerMapping.
https://github.com/spring-projects/spring-framework/blob/main/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/RequestMappingInfoHandlerMapping.java#L300
Below is a test created similar to the code above.
Result (from Async Profiler)
In my opinion, the following order seems like a good way.
(Suggested solution (3 + 2) -> 3 -> 2 -> 1)
I will make PR according to your opinion.
Thanks :)