David Schlosnagle created HTTPCORE-713:
------------------------------------------
Summary: Optimize InetAddressUtils#isIPv6*Address checks
Key: HTTPCORE-713
URL: https://issues.apache.org/jira/browse/HTTPCORE-713
Project: HttpComponents HttpCore
Issue Type: Improvement
Components: HttpCore
Reporter: David Schlosnagle
Attachments: 166573589-2c814d53-9639-4b14-82d0-9238f285be0b.png
See https://github.com/apache/httpcomponents-core/pull/347
Check input colon count before performing IPv6 regex validation.
{{org.apache.hc.core5.net.InetAddressUtils.isIPv6Address}} is used when
constructing the {{host}} header for requests, and currently allocates a regex
matcher when checking if the provided address is an IPv6 address. This is
generates excess garbage and CPU cycles, especially in environments with mostly
IPv4 addresses. By checking the colon count first, we see a 50x improvement
checking {{InetAddressUtils.isIPv6Address}} for an IPv4 address.
The specific call backtrace seen looks like:
{code:java}
void java.util.regex.Matcher.<init>(Pattern, CharSequence)
Matcher java.util.regex.Pattern.matcher(CharSequence)
boolean
org.apache.hc.core5.net.InetAddressUtils.isIPv6HexCompressedAddress(String)
boolean org.apache.hc.core5.net.InetAddressUtils.isIPv6Address(String)
void org.apache.hc.core5.net.Host.format(StringBuilder, NamedEndpoint)
void org.apache.hc.core5.net.URIAuthority.format(StringBuilder,
URIAuthority)
String org.apache.hc.core5.net.URIAuthority.format(URIAuthority)
String org.apache.hc.core5.net.URIAuthority.toString()
String java.util.Objects.toString(Object, String)
void org.apache.hc.core5.http.message.BasicHeader.<init>(String,
Object, boolean)
void org.apache.hc.core5.http.message.BasicHeader.<init>(String,
Object)
void
org.apache.hc.core5.http.message.BasicHttpRequest.addHeader(String, Object)
void
org.apache.hc.core5.http.protocol.RequestTargetHost.process(HttpRequest,
EntityDetails, HttpContext)
void
org.apache.hc.core5.http.protocol.DefaultHttpProcessor.process(HttpRequest,
EntityDetails, HttpContext)
ClassicHttpResponse
org.apache.hc.client5.http.impl.classic.ProtocolExec.execute(ClassicHttpRequest,
ExecChain$Scope, ExecChain)
ClassicHttpResponse
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ClassicHttpRequest,
ExecChain$Scope)
ClassicHttpResponse
org.apache.hc.client5.http.impl.classic.ExecChainElement$1.proceed(ClassicHttpRequest,
ExecChain$Scope)
ClassicHttpResponse
org.apache.hc.client5.http.impl.classic.RedirectExec.execute(ClassicHttpRequest,
ExecChain$Scope, ExecChain)
ClassicHttpResponse
org.apache.hc.client5.http.impl.classic.ExecChainElement.execute(ClassicHttpRequest,
ExecChain$Scope)
CloseableHttpResponse
org.apache.hc.client5.http.impl.classic.InternalHttpClient.doExecute(HttpHost,
ClassicHttpRequest, HttpContext)
CloseableHttpResponse
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(ClassicHttpRequest,
HttpContext)
CloseableHttpResponse
org.apache.hc.client5.http.impl.classic.CloseableHttpClient.execute(ClassicHttpRequest)
{code}
>From JFR profile:
!166573589-2c814d53-9639-4b14-82d0-9238f285be0b.png!
--
This message was sent by Atlassian Jira
(v8.20.7#820007)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]