# UNDF: UNDF-2026-000001008 --- a/src/simutrans/simhalt.cc +++ b/src/simutrans/simhalt.cc @@ -3295,14 +3295,19 @@ // iterate over all lines (public halt: all lines, other: only player's lines) for( uint8 i=pl_min; iget_player(i) ) { player->simlinemgmt.get_lines(simline_t::line, &check_line); for(linehandle_t const j : check_line ) { // only add unknown lines - if( !registered_lines.is_contained(j) && j->count_convoys() > 0 ) { + // Use a hash set for O(1) membership test instead of + // vector_tpl::is_contained O(R) linear scan per line. + // Previously O(L * R) where L = lines, R = registered lines. + if( !registered_lines_set.get(j.get_id()) && j->count_convoys() > 0 ) { for(schedule_entry_t const& k : j->get_schedule()->entries ) { if( get_halt(k.pos, player) == self ) { registered_lines.append(j); + registered_lines_set.put(j.get_id(), true); break; } } } } } } - // iterate over all convoys - for(convoihandle_t const cnv : welt->convoys()) { - // only check lineless convoys which have matching ownership and which are not yet registered - if( !cnv->get_line().is_bound() && (public_halt || cnv->get_owner()==get_owner()) && !registered_convoys.is_contained(cnv) ) { + // iterate over all convoys + // Build a temporary hash set of registered convoy IDs for O(1) lookup. + // Previously registered_convoys.is_contained(cnv) was O(R) linear scan + // called for every convoy in the world = O(C * R) total. + inthashtable_tpl registered_cnv_set; + for(convoihandle_t const cnv : registered_convoys) { + registered_cnv_set.put(cnv.get_id(), true); + } + for(convoihandle_t const cnv : welt->convoys()) { + // only check lineless convoys which have matching ownership and which are not yet registered + if( !cnv->get_line().is_bound() && (public_halt || cnv->get_owner()==get_owner()) && !registered_cnv_set.get(cnv.get_id()) ) { if( const schedule_t *const schedule = cnv->get_schedule() ) { for(schedule_entry_t const& k : schedule->entries) { if (get_halt(k.pos, cnv->get_owner()) == self) { registered_convoys.append(cnv); + registered_cnv_set.put(cnv.get_id(), true); break; } }