From c82d372d54554cfb79f74eedc67df2d4078d87e5 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 24 Aug 2020 18:04:03 +0100 Subject: [PATCH] Reduce performance issues in DeleteStaleLinks with refit to any cargo Remove redundant executions of LinkRefresher::Run --- src/station_cmd.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 1f15ce456c..726dccd7cf 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -60,6 +60,8 @@ #include "table/strings.h" +#include "3rdparty/cpp-btree/btree_set.h" + #include "safeguards.h" /** @@ -3893,6 +3895,13 @@ void RerouteCargo(Station *st, CargoID c, StationID avoid, StationID avoid2) } } +btree::btree_set _delete_stale_links_vehicle_cache; + +void ClearDeleteStaleLinksVehicleCache() +{ + _delete_stale_links_vehicle_cache.clear(); +} + /** * Check all next hops of cargo packets in this station for existence of a * a valid link they may use to travel on. Reroute any cargo not having a valid @@ -3944,7 +3953,11 @@ void DeleteStaleLinks(Station *from) while (iter != vehicles.end()) { Vehicle *v = *iter; - LinkRefresher::Run(v, false); // Don't allow merging. Otherwise lg might get deleted. + auto res = _delete_stale_links_vehicle_cache.insert(v->index); + // Only run LinkRefresher if vehicle was not already in the cache + if (res.second) { + LinkRefresher::Run(v, false); // Don't allow merging. Otherwise lg might get deleted. + } if (edge.LastUpdate() == _date) { updated = true; break; @@ -4054,6 +4067,8 @@ void OnTick_Station() { if (_game_mode == GM_EDITOR) return; + ClearDeleteStaleLinksVehicleCache(); + for (BaseStation *st : BaseStation::Iterate()) { StationHandleSmallTick(st);