Make QuicCryptoClientConfig::PopulateFromCanonicalConfig() more efficient. Change QuicCryptoClientConfig::PopulateFromCanonicalConfig() to perform only one lookup instead of three in case |canonical_server_map_| already contains |suffix_server_id|, and one lookup instead of two in case it does not. (Insertion without hint involves a lookup, insertion with hint does not.) PiperOrigin-RevId: 378863627
diff --git a/quic/core/crypto/quic_crypto_client_config.cc b/quic/core/crypto/quic_crypto_client_config.cc index c19798c..a3ec4ee 100644 --- a/quic/core/crypto/quic_crypto_client_config.cc +++ b/quic/core/crypto/quic_crypto_client_config.cc
@@ -847,23 +847,23 @@ QuicServerId suffix_server_id(canonical_suffixes_[i], server_id.port(), server_id.privacy_mode_enabled()); - if (canonical_server_map_.find(suffix_server_id) == - canonical_server_map_.end()) { + auto it = canonical_server_map_.lower_bound(suffix_server_id); + if (it == canonical_server_map_.end() || !(it->first == suffix_server_id)) { // This is the first host we've seen which matches the suffix, so make it - // canonical. - canonical_server_map_[suffix_server_id] = server_id; + // canonical. Use |it| as position hint for faster insertion. + canonical_server_map_.insert( + it, std::make_pair(std::move(suffix_server_id), std::move(server_id))); return false; } - const QuicServerId& canonical_server_id = - canonical_server_map_[suffix_server_id]; + const QuicServerId& canonical_server_id = it->second; CachedState* canonical_state = cached_states_[canonical_server_id].get(); if (!canonical_state->proof_valid()) { return false; } // Update canonical version to point at the "most recent" entry. - canonical_server_map_[suffix_server_id] = server_id; + it->second = server_id; server_state->InitializeFrom(*canonical_state); return true;