A sync_step handles moving of the vehicles and as such there is nothing that can be made about it. I optimized simutrans quite a lot, it is now about four times faster than the 88.x version. Unfourtunately that means you can double mapsize. SInce before 640*640 was the limit for sensible games now it is rather 1280*1280. I have not many ideas how to go much beyond this.
Most time is actually spend in haltestelle_t::suche_route (on a very busy map up to 10% of the time) and then in sync_step (dito 8% of the time). You can find more exhausive profiles in other threads, but this is the one for simutrans tandard, fast forward (so drawing will be as little as possible). The problem that all stuff like == operator for koord is used by many objects. Dobule the map size => four times more of those objects => four time more of those "tiny" functions that actually in the end consume most time.
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
9.17 27.77 27.77 1464066 0.00 0.00 haltestelle_t::suche_route(ware_t&, koord*, bool)
8.27 52.80 25.03 18190 0.00 0.00 karte_t::sync_step(long, bool, bool)
6.57 72.69 19.89 7202190 0.00 0.00 display_img_nc(short, short, short, unsigned short const*)
3.20 82.39 9.70 14631 0.00 0.00 route_t::find_route(karte_t*, koord3d, fahrer_t*, unsigned int, unsigned char, unsigned int)
2.62 90.31 7.93 1600259493 0.00 0.00 quickstone_tpl<haltestelle_t>::is_bound() const
2.14 96.78 6.47 1617542176 0.00 0.00 vector_tpl<quickstone_tpl<haltestelle_t> >::get_count() const
1.84 102.36 5.58 146667782 0.00 0.00 grund_t::get_weg(waytype_t) const
1.77 107.73 5.37 18667682 0.00 0.00 convoi_t::calc_acceleration(long)
1.75 113.02 5.29 241168851 0.00 0.00 grund_t::get_hoehe() const
1.65 118.03 5.01 189289339 0.00 0.00 ding_t::get_flag(ding_t::flag_values) const
1.63 122.98 4.95 135841753 0.00 0.00 planquadrat_t::get_boden_in_hoehe(short) const
1.61 127.85 4.87 1827594415 0.00 0.00 quickstone_tpl<haltestelle_t>::operator->() const
1.59 132.67 4.82 1530247510 0.00 0.00 vector_tpl<route_t::ANode*>::operator[](unsigned int)
1.58 137.44 4.77 158718767 0.00 0.00 dingliste_t::bei(unsigned char) const
1.56 142.15 4.71 1550056419 0.00 0.00 vector_tpl<quickstone_tpl<haltestelle_t> >::operator[](unsigned int) const
1.44 146.52 4.37 32313318 0.00 0.00 convoi_t::sync_step(long)
1.31 150.49 3.97 494281345 0.00 0.00 koord::koord(short, short)
1.30 154.42 3.93 1814820 0.00 0.00 haltestelle_t::hole_ab(ware_besch_t const*, unsigned int, schedule_t*)
1.22 158.12 3.70 524431256 0.00 0.00 slist_iterator_tpl<hashtable_tpl<sync_steppable*, sync_steppable*, ptrhash_tpl<sync_steppable*> >::node_t>::next()
1.04 161.26 3.14 81318192 0.00 0.00 ding_t::is_moving() const
1.01 164.32 3.06 353483309 0.00 0.00 koord3d::get_2d() const
1.01 167.38 3.06 259974142 0.00 0.00 operator==(koord const&, koord const&)