| // Copyright 2020 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // |
| // $ blaze run -c opt --dynamic_mode=off \ |
| // -- //net/third_party/quiche/src/http2/hpack/huffman:hpack_huffman_encoder_benchmark \ |
| // --benchmarks=all --benchmark_memory_usage --benchmark_repetitions=1 |
| // |
| // Benchmark Time(ns) CPU(ns) Allocs Iterations |
| // ----------------------------------------------------------------------------- |
| // BM_EncodeSmallStrings 255 255 0 2557738 0.000B peak-mem |
| // BM_E.SmallStringsFast 247 247 0 2849201 0.000B peak-mem |
| // BM_EncodeLargeString/1k 4270 4271 1 166430 656.000B peak-mem |
| // BM_EncodeLargeString/4k 16819 16820 1 40483 2.516kB peak-mem |
| // BM_EncodeLargeString/32k 135426 135416 1 5155 20.016kB peak-mem |
| // BM_EncodeLargeString/256k 1080893 1080922 1 647 160.016kB peak-mem |
| // BM_EncodeLargeString/2M 8698878 8699261 1 77 1.250MB peak-mem |
| // BM_EncodeLargeString/16M 70013626 70009631 1 10 10.000MB peak-mem |
| // BM_EncodeLargeString/128M 581697663 581739687 1 1 80.000MB peak-mem |
| // BM_E.LargeStringFast/1k 3820 3820 1 184203 656.000B peak-mem |
| // BM_E.LargeStringFast/4k 15148 15146 1 46341 2.516kB peak-mem |
| // BM_E.LargeStringFast/32k 120409 120426 1 5803 20.016kB peak-mem |
| // BM_E.LargeStringFast/256k 968802 968841 1 725 160.016kB peak-mem |
| // BM_E.LargeStringFast/2M 7769441 7767875 1 90 1.250MB peak-mem |
| // BM_E.LargeStringFast/16M 62571561 62581958 1 10 10.000MB peak-mem |
| // BM_E.LargeStringFast/128M 527393576 527376986 1 1 80.000MB peak-mem |
| // BM_EncodeLongCode/1k 15197 15200 1 45281 3.766kB peak-mem |
| // BM_EncodeLongCode/4k 60782 60775 1 10000 15.016kB peak-mem |
| // BM_EncodeLongCode/32k 489516 489692 1 1441 120.016kB peak-mem |
| // BM_EncodeLongCode/256k 3902949 3905536 1 179 960.016kB peak-mem |
| // BM_EncodeLongCode/2M 31275026 31281987 1 23 7.500MB peak-mem |
| // BM_EncodeLongCode/16M 258391322 258361112 1 3 60.000MB peak-mem |
| // BM_EncodeLongCode/128M 2098369854 2098398258 1 1 480.000MB peak-mem |
| // BM_E.LongCodeFast/1k 3915 3915 1 179602 3.766kB peak-mem |
| // BM_E.LongCodeFast/4k 15433 15435 1 45491 15.016kB peak-mem |
| // BM_E.LongCodeFast/32k 124756 124750 1 5689 120.016kB peak-mem |
| // BM_E.LongCodeFast/256k 1007523 1008291 1 700 960.016kB peak-mem |
| // BM_E.LongCodeFast/2M 8129166 8132764 1 87 7.500MB peak-mem |
| // BM_E.LongCodeFast/16M 72076964 72079949 1 9 60.000MB peak-mem |
| // BM_E.LongCodeFast/128M 631963502 631948474 1 1 480.000MB peak-mem |
| // |
| |
| #include <string> |
| |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Weverything" |
| // This header has multiple DCHECK_* macros with signed-unsigned comparison. |
| #include "testing/base/public/benchmark.h" |
| #pragma clang diagnostic pop |
| |
| #include "net/third_party/quiche/src/http2/hpack/huffman/hpack_huffman_encoder.h" |
| |
| namespace http2 { |
| namespace { |
| |
| void BM_EncodeSmallStrings(benchmark::State& state) { |
| const std::vector<const std::string> inputs{ |
| ":method", ":path", "cookie", "set-cookie", "vary", "accept-encoding"}; |
| for (auto s : state) { |
| for (const auto& input : inputs) { |
| size_t encoded_size = HuffmanSize(input); |
| std::string result; |
| HuffmanEncode(input, encoded_size, &result); |
| } |
| } |
| } |
| |
| void BM_EncodeSmallStringsFast(benchmark::State& state) { |
| const std::vector<const std::string> inputs{ |
| ":method", ":path", "cookie", "set-cookie", "vary", "accept-encoding"}; |
| for (auto s : state) { |
| for (const auto& input : inputs) { |
| size_t encoded_size = HuffmanSize(input); |
| std::string result; |
| HuffmanEncodeFast(input, encoded_size, &result); |
| } |
| } |
| } |
| |
| void BM_EncodeLargeString(benchmark::State& state) { |
| const std::string input(state.range(0), 'a'); |
| for (auto s : state) { |
| size_t encoded_size = HuffmanSize(input); |
| std::string result; |
| HuffmanEncode(input, encoded_size, &result); |
| } |
| } |
| |
| void BM_EncodeLargeStringFast(benchmark::State& state) { |
| const std::string input(state.range(0), 'a'); |
| for (auto s : state) { |
| size_t encoded_size = HuffmanSize(input); |
| std::string result; |
| HuffmanEncodeFast(input, encoded_size, &result); |
| } |
| } |
| |
| // 13 is one of the characters with the longest encoding: 30 bits. |
| // This will never be run in production, because HuffmanEncode is only called on |
| // strings that become shorter when encoded, but it gives an idea of compression |
| // speed when many characters in the input are encoded with long codes. |
| void BM_EncodeLongCode(benchmark::State& state) { |
| const std::string input(state.range(0), 13); |
| for (auto s : state) { |
| size_t encoded_size = HuffmanSize(input); |
| std::string result; |
| HuffmanEncode(input, encoded_size, &result); |
| } |
| } |
| |
| void BM_EncodeLongCodeFast(benchmark::State& state) { |
| const std::string input(state.range(0), 13); |
| for (auto s : state) { |
| size_t encoded_size = HuffmanSize(input); |
| std::string result; |
| HuffmanEncodeFast(input, encoded_size, &result); |
| } |
| } |
| |
| BENCHMARK(BM_EncodeSmallStrings); |
| BENCHMARK(BM_EncodeLargeString)->Range(1024, 128 * 1024 * 1024); |
| BENCHMARK(BM_EncodeLongCode)->Range(1024, 128 * 1024 * 1024); |
| BENCHMARK(BM_EncodeSmallStringsFast); |
| BENCHMARK(BM_EncodeLargeStringFast)->Range(1024, 128 * 1024 * 1024); |
| BENCHMARK(BM_EncodeLongCodeFast)->Range(1024, 128 * 1024 * 1024); |
| |
| } // namespace |
| } // namespace http2 |