Home / Class/ Http2PseudoHeadersLookupBenchmark Class — netty Architecture

Http2PseudoHeadersLookupBenchmark Class — netty Architecture

Architecture documentation for the Http2PseudoHeadersLookupBenchmark class in Http2PseudoHeadersLookupBenchmark.java from the netty codebase.

Entity Profile

Dependency Diagram

graph TD
  098bd603_5fdc_d6b3_c285_95fcd39a73b6["Http2PseudoHeadersLookupBenchmark"]
  90a9f25f_2549_d5c0_24f2_4cf845450104["Http2PseudoHeadersLookupBenchmark.java"]
  098bd603_5fdc_d6b3_c285_95fcd39a73b6 -->|defined in| 90a9f25f_2549_d5c0_24f2_4cf845450104
  73539fe4_5f80_0052_8f36_a55371f1a1e6["init()"]
  098bd603_5fdc_d6b3_c285_95fcd39a73b6 -->|method| 73539fe4_5f80_0052_8f36_a55371f1a1e6
  0726e9ec_824e_6605_25b3_0f8d338fdaad["getAsciiStringPseudoHeader()"]
  098bd603_5fdc_d6b3_c285_95fcd39a73b6 -->|method| 0726e9ec_824e_6605_25b3_0f8d338fdaad
  abfee9fa_9774_8f70_e49a_891dcdc07b82["getStringPseudoHeader()"]
  098bd603_5fdc_d6b3_c285_95fcd39a73b6 -->|method| abfee9fa_9774_8f70_e49a_891dcdc07b82
  d5447a20_892a_2cfe_6e3c_b3e6cb0638c8["addAsciiStringInHttp2Headers()"]
  098bd603_5fdc_d6b3_c285_95fcd39a73b6 -->|method| d5447a20_892a_2cfe_6e3c_b3e6cb0638c8
  86d7b419_7fcc_f579_a4c2_f53d8255d7d7["addStringInHttp2Headers()"]
  098bd603_5fdc_d6b3_c285_95fcd39a73b6 -->|method| 86d7b419_7fcc_f579_a4c2_f53d8255d7d7

Relationship Graph

Source Code

microbench/src/main/java/io/netty/handler/codec/http2/Http2PseudoHeadersLookupBenchmark.java lines 37–121

@State(Scope.Benchmark)
@Warmup(iterations = 10, time = 200, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 200, timeUnit = TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class Http2PseudoHeadersLookupBenchmark extends AbstractMicrobenchmark {

    @Param({ "true", "false" })
    public boolean same;

    private AsciiString[] asciiStrings;
    private String[] strings;

    private DefaultHttp2Headers headers;
    @Setup
    public void init() {
        // this benchmark is assuming a good happy path:
        // 1. ascii strings have hashCode cached
        // 2. String doesn't have AsciiString::hashCode cached -> cannot be compared directly with AsciiStrings!
        // 3. the call-sites are never observing the 2 types together
        PseudoHeaderName[] pseudoHeaderNames = PseudoHeaderName.values();
        asciiStrings = new AsciiString[pseudoHeaderNames.length];
        strings = new String[pseudoHeaderNames.length];
        for (int i = 0; i < pseudoHeaderNames.length; i++) {
            PseudoHeaderName pseudoHeaderName = pseudoHeaderNames[i];
            asciiStrings[i] = same? pseudoHeaderName.value() : new AsciiString(pseudoHeaderName.value().array(), true);
            byte[] chars = asciiStrings[i].array();
            strings[i] = same? pseudoHeaderName.value().toString() : new String(chars, 0, 0, chars.length);
            // force hashCode caching
            asciiStrings[i].hashCode();
            pseudoHeaderName.hashCode();
            pseudoHeaderName.toString().hashCode();
            strings[i].hashCode();
        }
        this.headers = new DefaultHttp2Headers();
    }

    @Benchmark
    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    public void getAsciiStringPseudoHeader(Blackhole bh) {
        for (AsciiString asciiString : asciiStrings) {
            bh.consume(PseudoHeaderName.getPseudoHeader(asciiString));
        }
    }

    @Benchmark
    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    public void getStringPseudoHeader(Blackhole bh) {
        for (String string : strings) {
            bh.consume(PseudoHeaderName.getPseudoHeader(string));
        }
    }

    @Benchmark
    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    public void addAsciiStringInHttp2Headers(Blackhole bh) {
        DefaultHttp2Headers headers = this.headers;
        for (AsciiString asciiString : asciiStrings) {
            boolean hasPrefix = PseudoHeaderName.hasPseudoHeaderFormat(asciiString);
            if (hasPrefix) {
                boolean isPseudoHeader = PseudoHeaderName.isPseudoHeader(asciiString);
                if (isPseudoHeader) {
                    bh.consume(headers.add(asciiString, "0"));
                    headers.clear();
                }
            }
        }
    }

    @Benchmark
    @CompilerControl(CompilerControl.Mode.DONT_INLINE)
    public void addStringInHttp2Headers(Blackhole bh) {
        DefaultHttp2Headers headers = this.headers;
        for (String asciiString : strings) {
            boolean hasPrefix = PseudoHeaderName.hasPseudoHeaderFormat(asciiString);
            if (hasPrefix) {
                boolean isPseudoHeader = PseudoHeaderName.isPseudoHeader(asciiString);
                if (isPseudoHeader) {
                    bh.consume(headers.add(asciiString, "0"));
                    headers.clear();
                }

Frequently Asked Questions

What is the Http2PseudoHeadersLookupBenchmark class?
Http2PseudoHeadersLookupBenchmark is a class in the netty codebase, defined in microbench/src/main/java/io/netty/handler/codec/http2/Http2PseudoHeadersLookupBenchmark.java.
Where is Http2PseudoHeadersLookupBenchmark defined?
Http2PseudoHeadersLookupBenchmark is defined in microbench/src/main/java/io/netty/handler/codec/http2/Http2PseudoHeadersLookupBenchmark.java at line 37.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free