Use faster Huffman encoding for HPACK. Protected by FLAGS_gfe2_reloadable_flag_spdy_use_fast_huffman_encoder. PiperOrigin-RevId: 335922459 Change-Id: Ie45cd16554d8bd7dfd3f63f8e25aadf465561e79
diff --git a/spdy/core/hpack/hpack_encoder.cc b/spdy/core/hpack/hpack_encoder.cc index 64d0005..566f4ee 100644 --- a/spdy/core/hpack/hpack_encoder.cc +++ b/spdy/core/hpack/hpack_encoder.cc
@@ -8,6 +8,7 @@ #include <limits> #include <utility> +#include "net/third_party/quiche/src/http2/hpack/huffman/hpack_huffman_encoder.h" #include "net/third_party/quiche/src/spdy/core/hpack/hpack_constants.h" #include "net/third_party/quiche/src/spdy/core/hpack/hpack_header_table.h" #include "net/third_party/quiche/src/spdy/core/hpack/hpack_huffman_table.h" @@ -84,7 +85,9 @@ listener_(NoOpListener), should_index_(DefaultPolicy), enable_compression_(true), - should_emit_table_size_(false) {} + should_emit_table_size_(false), + use_fast_huffman_encoder_( + GetSpdyReloadableFlag(http2_use_fast_huffman_encoder)) {} HpackEncoder::~HpackEncoder() = default; @@ -199,13 +202,21 @@ void HpackEncoder::EmitString(quiche::QuicheStringPiece str) { size_t encoded_size = - enable_compression_ ? huffman_table_.EncodedSize(str) : str.size(); + enable_compression_ + ? (use_fast_huffman_encoder_ ? http2::HuffmanSize(str) + : huffman_table_.EncodedSize(str)) + : str.size(); if (encoded_size < str.size()) { SPDY_DVLOG(2) << "Emitted Huffman-encoded string of length " << encoded_size; output_stream_.AppendPrefix(kStringLiteralHuffmanEncoded); output_stream_.AppendUint32(encoded_size); - huffman_table_.EncodeString(str, &output_stream_); + if (use_fast_huffman_encoder_) { + http2::HuffmanEncodeFast(str, encoded_size, + output_stream_.MutableString()); + } else { + huffman_table_.EncodeString(str, &output_stream_); + } } else { SPDY_DVLOG(2) << "Emitted literal string of length " << str.size(); output_stream_.AppendPrefix(kStringLiteralIdentityEncoded);
diff --git a/spdy/core/hpack/hpack_encoder.h b/spdy/core/hpack/hpack_encoder.h index 2455f3d..3b3e0d1 100644 --- a/spdy/core/hpack/hpack_encoder.h +++ b/spdy/core/hpack/hpack_encoder.h
@@ -148,6 +148,8 @@ IndexingPolicy should_index_; bool enable_compression_; bool should_emit_table_size_; + // Latched value of gfe2_reloadable_flag_http2_use_fast_huffman_encoder. + const bool use_fast_huffman_encoder_; }; } // namespace spdy