@@ -58,12 +58,25 @@ struct PreparedBlockConnectionGroupBuilder {
5858}
5959
6060fn finalize_prepared_connection_map (
61- connections : Vec < PreparedBlockConnectionBuilder > ,
61+ connections : impl IntoIterator < Item = PreparedBlockConnectionBuilder > ,
62+ capacity : usize ,
6263) -> PreparedBlockConnectionMap {
63- let mut groups = Vec :: < PreparedBlockConnectionGroupBuilder > :: new ( ) ;
64- let mut group_index_by_block = DependenciesBlockIdentifierMap :: < IdentifierMap < usize > > :: default ( ) ;
64+ let mut groups = Vec :: < PreparedBlockConnectionGroupBuilder > :: with_capacity ( capacity ) ;
65+ let mut group_index_by_block = Vec :: < ( DependenciesBlockIdentifier , IdentifierMap < usize > ) > :: new ( ) ;
6566 for connection in connections {
66- let index_by_module = group_index_by_block. entry ( connection. block ) . or_default ( ) ;
67+ let index_by_module = if let Some ( ( _, index_by_module) ) = group_index_by_block
68+ . iter_mut ( )
69+ . find ( |( block, _) | * block == connection. block )
70+ {
71+ index_by_module
72+ } else {
73+ group_index_by_block. push ( ( connection. block , IdentifierMap :: default ( ) ) ) ;
74+ & mut group_index_by_block
75+ . last_mut ( )
76+ . expect ( "should have block" )
77+ . 1
78+ } ;
79+
6780 if let Some ( index) = index_by_module. get ( & connection. module ) {
6881 groups[ * index] . connections . push ( connection. dependency ) ;
6982 continue ;
@@ -2317,10 +2330,10 @@ Or do you want to use the entrypoints '{name}' and '{runtime}' independently on
23172330 . module_graph_module_by_identifier ( module)
23182331 . map ( |mgm| mgm. all_dependencies ( ) )
23192332 . unwrap_or_default ( ) ;
2320- let mut connection_map = Vec :: new ( ) ;
2333+ let dependency_count = all_dependencies . len ( ) ;
23212334
23222335 let mut ordered_deps = Vec :: new ( ) ;
2323- let mut unordered_deps = Vec :: new ( ) ;
2336+ let mut unordered_deps = Vec :: with_capacity ( dependency_count ) ;
23242337 for dep_id in all_dependencies {
23252338 let Some ( connection) = mg. connection_by_dependency_id ( dep_id) else {
23262339 continue ;
@@ -2348,23 +2361,30 @@ Or do you want to use the entrypoints '{name}' and '{runtime}' independently on
23482361 }
23492362 ordered_deps. sort_by_key ( |( source_order, _, _, _) | * source_order) ;
23502363
2351- for ( _, block, dependency, module) in ordered_deps {
2352- connection_map. push ( PreparedBlockConnectionBuilder {
2353- block,
2354- module,
2355- dependency,
2356- } ) ;
2357- }
2358-
2359- for ( block, dependency, module) in unordered_deps {
2360- connection_map. push ( PreparedBlockConnectionBuilder {
2361- block,
2362- module,
2363- dependency,
2364- } ) ;
2365- }
2364+ let connection_count = ordered_deps. len ( ) + unordered_deps. len ( ) ;
2365+ let ordered_deps = ordered_deps
2366+ . into_iter ( )
2367+ . map (
2368+ |( _, block, dependency, module) | PreparedBlockConnectionBuilder {
2369+ block,
2370+ module,
2371+ dependency,
2372+ } ,
2373+ ) ;
2374+ let unordered_deps = unordered_deps
2375+ . into_iter ( )
2376+ . map (
2377+ |( block, dependency, module) | PreparedBlockConnectionBuilder {
2378+ block,
2379+ module,
2380+ dependency,
2381+ } ,
2382+ ) ;
23662383
2367- ( * module, finalize_prepared_connection_map ( connection_map) )
2384+ (
2385+ * module,
2386+ finalize_prepared_connection_map ( ordered_deps. chain ( unordered_deps) , connection_count) ,
2387+ )
23682388 } )
23692389 . collect :: < IdentifierMap < _ > > ( ) ;
23702390
0 commit comments