Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
17eb2ae
Optimize IP field parsing
felixbarny Aug 5, 2025
55bb8d6
Fix bug in convertDottedQuadToHex
felixbarny Aug 5, 2025
31a6385
Small performance improvements for ipv4 parsing
felixbarny Aug 7, 2025
11aafe4
Merge branch 'main' into ip-parsing-optimization
felixbarny Aug 8, 2025
4c95f1f
Reduce memory allocations by avoiding InetAddress
felixbarny Aug 12, 2025
725fae9
Merge remote-tracking branch 'origin/main' into ip-parsing-optimization
felixbarny Aug 12, 2025
02bc756
Avoid lambda overhead
felixbarny Aug 12, 2025
594bf80
Avoid forbidden APIs
felixbarny Aug 12, 2025
58c2611
Merge branch 'main' into ip-parsing-optimization
felixbarny Aug 12, 2025
0c16cab
Fix tests that expected an InetAddressPoint
felixbarny Aug 13, 2025
e626e8f
More allocation optimizations for parsing ip4v addresses
felixbarny Aug 13, 2025
f90f7f4
Merge remote-tracking branch 'origin/main' into ip-parsing-optimization
felixbarny Aug 13, 2025
3cb3979
Merge remote-tracking branch 'origin/main' into ip-parsing-optimization
felixbarny Aug 18, 2025
c4c48f4
Address comments from review
felixbarny Aug 18, 2025
bfe7c62
Merge remote-tracking branch 'origin/main' into ip-parsing-optimization
felixbarny Aug 19, 2025
349792d
Address review comments
felixbarny Aug 19, 2025
f201471
Remove remaining use of Text
felixbarny Aug 19, 2025
90eacee
Add benchmarks
felixbarny Aug 19, 2025
88afe92
Merge remote-tracking branch 'origin/main' into ip-parsing-optimization
felixbarny Aug 19, 2025
e2fc667
Simplify and optimize quad to hex conversion
felixbarny Aug 19, 2025
93e0691
Merge branch 'main' into ip-parsing-optimization
felixbarny Aug 19, 2025
61ecab5
[CI] Auto commit changes from spotless
Aug 19, 2025
2b1d9d1
Use root locale for String.format
felixbarny Aug 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the "Elastic License
* 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side
* Public License v 1"; you may not use this file except in compliance with, at
* your election, the "Elastic License 2.0", the "GNU Affero General Public
* License v3.0 only", or the "Server Side Public License, v 1".
*/

package org.elasticsearch.benchmark.common.network;

import org.elasticsearch.common.network.InetAddresses;
import org.elasticsearch.xcontent.Text;
import org.elasticsearch.xcontent.XContentString;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.infra.Blackhole;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

@Warmup(iterations = 2)
@Measurement(iterations = 3)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Benchmark)
@Fork(1)
public class IpAddressesBenchmarks {

@Param("1000")
private int size;
private String[] ipV6Addresses;
private String[] ipV4Addresses;
private XContentString[] ipV6AddressesBytes;
private XContentString[] ipV4AddressesBytes;

@Setup
public void setup() throws UnknownHostException {
Random random = new Random();
ipV6Addresses = new String[size];
ipV4Addresses = new String[size];
ipV6AddressesBytes = new XContentString[size];
ipV4AddressesBytes = new XContentString[size];
byte[] ipv6Bytes = new byte[16];
byte[] ipv4Bytes = new byte[4];
for (int i = 0; i < size; i++) {
random.nextBytes(ipv6Bytes);
random.nextBytes(ipv4Bytes);
String ipv6String = InetAddresses.toAddrString(InetAddress.getByAddress(ipv6Bytes));
String ipv4String = InetAddresses.toAddrString(InetAddress.getByAddress(ipv4Bytes));
ipV6Addresses[i] = ipv6String;
ipV4Addresses[i] = ipv4String;
ipV6AddressesBytes[i] = new Text(ipv6String);
ipV4AddressesBytes[i] = new Text(ipv4String);
}
}

@Benchmark
public boolean isInetAddressIpv6() {
boolean b = true;
for (int i = 0; i < size; i++) {
b ^= InetAddresses.isInetAddress(ipV6Addresses[i]);
}
return b;
}

@Benchmark
public boolean isInetAddressIpv4() {
boolean b = true;
for (int i = 0; i < size; i++) {
b ^= InetAddresses.isInetAddress(ipV4Addresses[i]);
}
return b;
}

@Benchmark
public void getIpOrHostIpv6(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.getIpOrHost(ipV6Addresses[i]));
}
}

@Benchmark
public void getIpOrHostIpv4(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.forString(ipV4Addresses[i]));
}
}

@Benchmark
public void forStringIpv6String(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.forString(ipV6Addresses[i]));
}
}

@Benchmark
public void forStringIpv4String(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.forString(ipV4Addresses[i]));
}
}

@Benchmark
public void forStringIpv6Bytes(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.forString(ipV6AddressesBytes[i].bytes()));
}
}

@Benchmark
public void forStringIpv4Bytes(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.forString(ipV4AddressesBytes[i].bytes()));
}
}

@Benchmark
public void encodeAsIpv6WithIpv6(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.encodeAsIpv6(ipV6AddressesBytes[i]));
}
}

@Benchmark
public void encodeAsIpv6WithIpv4(Blackhole blackhole) {
for (int i = 0; i < size; i++) {
blackhole.consume(InetAddresses.encodeAsIpv6(ipV4AddressesBytes[i]));
}
}
}
Loading