FlowStat: Replace btree_map with flat map which is inlined in small case

Inline storage for size <= 2
Size = 1 is ~90%
Size = 2 is ~9%
Size >=3 is ~1% and gets a separate allocation
This commit is contained in:
Jonathan G Rennison
2019-09-30 10:26:07 +01:00
parent 90550d9642
commit 0246d59c8d
8 changed files with 275 additions and 161 deletions

View File

@@ -195,10 +195,9 @@ void ScriptStationList_CargoPlanned::Add(StationID station_id, CargoID cargo, St
FlowStatMap::const_iterator iter = collector.GE()->flows.begin();
FlowStatMap::const_iterator end = collector.GE()->flows.end();
for (; iter != end; ++iter) {
const FlowStat::SharesMap *shares = iter->GetShares();
uint prev = 0;
for (FlowStat::SharesMap::const_iterator flow_iter = shares->begin();
flow_iter != shares->end(); ++flow_iter) {
for (FlowStat::const_iterator flow_iter = iter->begin();
flow_iter != iter->end(); ++flow_iter) {
collector.Update<Tselector>(iter->GetOrigin(), flow_iter->second, flow_iter->first - prev);
prev = flow_iter->first;
}
@@ -265,10 +264,9 @@ ScriptStationList_CargoPlannedFromByVia::ScriptStationList_CargoPlannedFromByVia
FlowStatMap::const_iterator iter = collector.GE()->flows.find(from);
if (iter == collector.GE()->flows.end()) return;
const FlowStat::SharesMap *shares = iter->GetShares();
uint prev = 0;
for (FlowStat::SharesMap::const_iterator flow_iter = shares->begin();
flow_iter != shares->end(); ++flow_iter) {
for (FlowStat::const_iterator flow_iter = iter->begin();
flow_iter != iter->end(); ++flow_iter) {
collector.Update<CS_FROM_BY_VIA>(iter->GetOrigin(), flow_iter->second, flow_iter->first - prev);
prev = flow_iter->first;
}