Use flat_map/flat_set in RtpDemuxer
Except for a use of std::multimap (for which there currently is no
drop-in replacement), use webrtc::flat_map and flat_set for increased
performance.
The number of ssrcs/mids/payload types/etc is likely to be small and is
generally updated very rarely, but looked up a lot.
RtpDemuxer::ResolveSink's use of std::map represents about 0.6% CPU in
heavily loaded media servers. It does quite a few map lookups, and by
taking advantage of the increased cache locality of the flat_map and
flat_set containers, performance should be increased.
A previous attempt to use std::unordered_map failed in change 216243,
which was reverted. This is the second attempt.
Bug: webrtc:12689
Change-Id: Ifdbec63b2fd8f2f52e45ebaf12834b11dd7a41c5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/224662
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Commit-Queue: Victor Boivie <boivie@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34429}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index 1e920b8..638eb0b 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -147,6 +147,8 @@
"../modules/rtp_rtcp:rtp_rtcp_format",
"../rtc_base:checks",
"../rtc_base:rtc_base_approved",
+ "../rtc_base/containers:flat_map",
+ "../rtc_base/containers:flat_set",
]
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
diff --git a/call/rtp_demuxer.cc b/call/rtp_demuxer.cc
index ee96196..28962fd 100644
--- a/call/rtp_demuxer.cc
+++ b/call/rtp_demuxer.cc
@@ -36,16 +36,7 @@
template <typename Map, typename Value>
size_t RemoveFromMapByValue(Map* map, const Value& value) {
- size_t count = 0;
- for (auto it = map->begin(); it != map->end();) {
- if (it->second == value) {
- it = map->erase(it);
- ++count;
- } else {
- ++it;
- }
- }
- return count;
+ return EraseIf(*map, [&](const auto& elem) { return elem.second == value; });
}
} // namespace
diff --git a/call/rtp_demuxer.h b/call/rtp_demuxer.h
index b71c2bc..fb65fce 100644
--- a/call/rtp_demuxer.h
+++ b/call/rtp_demuxer.h
@@ -12,11 +12,13 @@
#define CALL_RTP_DEMUXER_H_
#include <map>
-#include <set>
#include <string>
#include <utility>
#include <vector>
+#include "rtc_base/containers/flat_map.h"
+#include "rtc_base/containers/flat_set.h"
+
namespace webrtc {
class RtpPacketReceived;
@@ -42,10 +44,10 @@
std::string rsid;
// Will match packets with any of these SSRCs.
- std::set<uint32_t> ssrcs;
+ flat_set<uint32_t> ssrcs;
// Will match packets with any of these payload types.
- std::set<uint8_t> payload_types;
+ flat_set<uint8_t> payload_types;
// Return string representation of demux criteria to facilitate logging
std::string ToString() const;
@@ -168,24 +170,24 @@
// Note: Mappings are only modified by AddSink/RemoveSink (except for
// SSRC mapping which receives all MID, payload type, or RSID to SSRC bindings
// discovered when demuxing packets).
- std::map<std::string, RtpPacketSinkInterface*> sink_by_mid_;
- std::map<uint32_t, RtpPacketSinkInterface*> sink_by_ssrc_;
+ flat_map<std::string, RtpPacketSinkInterface*> sink_by_mid_;
+ flat_map<uint32_t, RtpPacketSinkInterface*> sink_by_ssrc_;
std::multimap<uint8_t, RtpPacketSinkInterface*> sinks_by_pt_;
- std::map<std::pair<std::string, std::string>, RtpPacketSinkInterface*>
+ flat_map<std::pair<std::string, std::string>, RtpPacketSinkInterface*>
sink_by_mid_and_rsid_;
- std::map<std::string, RtpPacketSinkInterface*> sink_by_rsid_;
+ flat_map<std::string, RtpPacketSinkInterface*> sink_by_rsid_;
// Tracks all the MIDs that have been identified in added criteria. Used to
// determine if a packet should be dropped right away because the MID is
// unknown.
- std::set<std::string> known_mids_;
+ flat_set<std::string> known_mids_;
// Records learned mappings of MID --> SSRC and RSID --> SSRC as packets are
// received.
// This is stored separately from the sink mappings because if a sink is
// removed we want to still remember these associations.
- std::map<uint32_t, std::string> mid_by_ssrc_;
- std::map<uint32_t, std::string> rsid_by_ssrc_;
+ flat_map<uint32_t, std::string> mid_by_ssrc_;
+ flat_map<uint32_t, std::string> rsid_by_ssrc_;
// Adds a binding from the SSRC to the given sink.
void AddSsrcSinkBinding(uint32_t ssrc, RtpPacketSinkInterface* sink);