Replaces std::deque with quiche::QuicheCircularDeque in http2::PriorityWriteScheduler.
std::deque allocates a 4kB block, even if it's only storing a single element:
http://google3/third_party/crosstool/v18/stable/installs/llvm/include/c++/v1/deque;l=294;rcl=438152875
QuicheCircularDeque should be a much more efficient data type for small container sizes.
PiperOrigin-RevId: 439672104
diff --git a/http2/core/priority_write_scheduler.h b/http2/core/priority_write_scheduler.h
index 87de3a7..cf1c77a 100644
--- a/http2/core/priority_write_scheduler.h
+++ b/http2/core/priority_write_scheduler.h
@@ -8,7 +8,6 @@
#include <algorithm>
#include <cstddef>
#include <cstdint>
-#include <deque>
#include <string>
#include <tuple>
#include <unordered_map>
@@ -20,6 +19,7 @@
#include "common/platform/api/quiche_bug_tracker.h"
#include "common/platform/api/quiche_export.h"
#include "common/platform/api/quiche_logging.h"
+#include "common/quiche_circular_deque.h"
#include "spdy/core/spdy_protocol.h"
namespace http2 {
@@ -294,7 +294,7 @@
};
// O(1) size lookup, O(1) insert at front or back (amortized).
- using ReadyList = std::deque<StreamInfo*>;
+ using ReadyList = quiche::QuicheCircularDeque<StreamInfo*>;
// State kept for each priority level.
struct QUICHE_EXPORT_PRIVATE PriorityInfo {
@@ -306,15 +306,15 @@
typedef std::unordered_map<StreamIdType, StreamInfo> StreamInfoMap;
- // Erases first occurrence (which should be the only one) of |info| in
- // |ready_list|, returning true if found (and erased), or false otherwise.
- // Decrements |num_ready_streams_| if an entry is erased.
+ // Erases `info` from `ready_list`, returning true if found (and erased), or
+ // false otherwise. Decrements `num_ready_streams_` if an entry is erased.
bool Erase(ReadyList* ready_list, const StreamInfo& info) {
- auto it = std::find(ready_list->begin(), ready_list->end(), &info);
+ auto it = std::remove(ready_list->begin(), ready_list->end(), &info);
if (it == ready_list->end()) {
+ // `info` was not found.
return false;
}
- ready_list->erase(it);
+ ready_list->pop_back();
--num_ready_streams_;
return true;
}