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