1
0
Fork 0

Codechange: Use vectors instead of CallocT/free for cache checks. (#12619)

Vectors are reused for each vehicle chain to save on reallocations.
pull/12622/head
Peter Nelson 2024-05-04 09:42:20 +01:00 committed by GitHub
parent 115ac2629b
commit f629d3c921
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 15 additions and 20 deletions

View File

@ -79,34 +79,29 @@ void CheckCaches()
rs->GetEntry(DIAGDIR_NW)->CheckIntegrity(rs); rs->GetEntry(DIAGDIR_NW)->CheckIntegrity(rs);
} }
std::vector<NewGRFCache> grf_cache;
std::vector<VehicleCache> veh_cache;
std::vector<GroundVehicleCache> gro_cache;
std::vector<TrainCache> tra_cache;
for (Vehicle *v : Vehicle::Iterate()) { for (Vehicle *v : Vehicle::Iterate()) {
if (v != v->First() || v->vehstatus & VS_CRASHED || !v->IsPrimaryVehicle()) continue; if (v != v->First() || v->vehstatus & VS_CRASHED || !v->IsPrimaryVehicle()) continue;
uint length = 0;
for (const Vehicle *u = v; u != nullptr; u = u->Next()) length++;
NewGRFCache *grf_cache = CallocT<NewGRFCache>(length);
VehicleCache *veh_cache = CallocT<VehicleCache>(length);
GroundVehicleCache *gro_cache = CallocT<GroundVehicleCache>(length);
TrainCache *tra_cache = CallocT<TrainCache>(length);
length = 0;
for (const Vehicle *u = v; u != nullptr; u = u->Next()) { for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
FillNewGRFVehicleCache(u); FillNewGRFVehicleCache(u);
grf_cache[length] = u->grf_cache; grf_cache.emplace_back(u->grf_cache);
veh_cache[length] = u->vcache; veh_cache.emplace_back(u->vcache);
switch (u->type) { switch (u->type) {
case VEH_TRAIN: case VEH_TRAIN:
gro_cache[length] = Train::From(u)->gcache; gro_cache.emplace_back(Train::From(u)->gcache);
tra_cache[length] = Train::From(u)->tcache; tra_cache.emplace_back(Train::From(u)->tcache);
break; break;
case VEH_ROAD: case VEH_ROAD:
gro_cache[length] = RoadVehicle::From(u)->gcache; gro_cache.emplace_back(RoadVehicle::From(u)->gcache);
break; break;
default: default:
break; break;
} }
length++;
} }
switch (v->type) { switch (v->type) {
@ -117,7 +112,7 @@ void CheckCaches()
default: break; default: break;
} }
length = 0; uint length = 0;
for (const Vehicle *u = v; u != nullptr; u = u->Next()) { for (const Vehicle *u = v; u != nullptr; u = u->Next()) {
FillNewGRFVehicleCache(u); FillNewGRFVehicleCache(u);
if (grf_cache[length] != u->grf_cache) { if (grf_cache[length] != u->grf_cache) {
@ -146,10 +141,10 @@ void CheckCaches()
length++; length++;
} }
free(grf_cache); grf_cache.clear();
free(veh_cache); veh_cache.clear();
free(gro_cache); gro_cache.clear();
free(tra_cache); tra_cache.clear();
} }
/* Check whether the caches are still valid */ /* Check whether the caches are still valid */