Skip to content

Commit 09067db

Browse files
committed
Serialize dependency graph directly from DepGraph
Reduce memory usage by serializing dep graph directly from `DepGraph`, rather than copying it into `SerializedDepGraph` and serializing that.
1 parent 704e47f commit 09067db

File tree

4 files changed

+328
-170
lines changed

4 files changed

+328
-170
lines changed

compiler/rustc_incremental/src/persist/save.rs

+7-75
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_data_structures::fx::FxHashMap;
22
use rustc_data_structures::sync::join;
3-
use rustc_middle::dep_graph::{DepGraph, DepKind, WorkProduct, WorkProductId};
3+
use rustc_middle::dep_graph::{DepGraph, WorkProduct, WorkProductId};
44
use rustc_middle::ty::TyCtxt;
55
use rustc_serialize::opaque::{FileEncodeResult, FileEncoder};
66
use rustc_serialize::Encodable as RustcEncodable;
@@ -148,83 +148,15 @@ fn encode_dep_graph(tcx: TyCtxt<'_>, encoder: &mut FileEncoder) -> FileEncodeRes
148148
// First encode the commandline arguments hash
149149
tcx.sess.opts.dep_tracking_hash().encode(encoder)?;
150150

151-
// Encode the graph data.
152-
let serialized_graph =
153-
tcx.sess.time("incr_comp_serialize_dep_graph", || tcx.dep_graph.serialize());
154-
155151
if tcx.sess.opts.debugging_opts.incremental_info {
156-
#[derive(Clone)]
157-
struct Stat {
158-
kind: DepKind,
159-
node_counter: u64,
160-
edge_counter: u64,
161-
}
162-
163-
let total_node_count = serialized_graph.nodes.len();
164-
let total_edge_count = serialized_graph.edge_list_data.len();
165-
166-
let mut counts: FxHashMap<_, Stat> =
167-
FxHashMap::with_capacity_and_hasher(total_node_count, Default::default());
168-
169-
for (i, &node) in serialized_graph.nodes.iter_enumerated() {
170-
let stat = counts.entry(node.kind).or_insert(Stat {
171-
kind: node.kind,
172-
node_counter: 0,
173-
edge_counter: 0,
174-
});
175-
176-
stat.node_counter += 1;
177-
let (edge_start, edge_end) = serialized_graph.edge_list_indices[i];
178-
stat.edge_counter += (edge_end - edge_start) as u64;
179-
}
180-
181-
let mut counts: Vec<_> = counts.values().cloned().collect();
182-
counts.sort_by_key(|s| -(s.node_counter as i64));
183-
184-
println!("[incremental]");
185-
println!("[incremental] DepGraph Statistics");
186-
187-
const SEPARATOR: &str = "[incremental] --------------------------------\
188-
----------------------------------------------\
189-
------------";
190-
191-
println!("{}", SEPARATOR);
192-
println!("[incremental]");
193-
println!("[incremental] Total Node Count: {}", total_node_count);
194-
println!("[incremental] Total Edge Count: {}", total_edge_count);
195-
if let Some((total_edge_reads, total_duplicate_edge_reads)) =
196-
tcx.dep_graph.edge_deduplication_data()
197-
{
198-
println!("[incremental] Total Edge Reads: {}", total_edge_reads);
199-
println!("[incremental] Total Duplicate Edge Reads: {}", total_duplicate_edge_reads);
200-
}
201-
println!("[incremental]");
202-
println!(
203-
"[incremental] {:<36}| {:<17}| {:<12}| {:<17}|",
204-
"Node Kind", "Node Frequency", "Node Count", "Avg. Edge Count"
205-
);
206-
println!(
207-
"[incremental] -------------------------------------\
208-
|------------------\
209-
|-------------\
210-
|------------------|"
211-
);
212-
213-
for stat in counts.iter() {
214-
println!(
215-
"[incremental] {:<36}|{:>16.1}% |{:>12} |{:>17.1} |",
216-
format!("{:?}", stat.kind),
217-
(100.0 * (stat.node_counter as f64)) / (total_node_count as f64), // percentage of all nodes
218-
stat.node_counter,
219-
(stat.edge_counter as f64) / (stat.node_counter as f64), // average edges per kind
220-
);
221-
}
222-
223-
println!("{}", SEPARATOR);
224-
println!("[incremental]");
152+
tcx.dep_graph.print_incremental_info();
225153
}
226154

227-
tcx.sess.time("incr_comp_encode_serialized_dep_graph", || serialized_graph.encode(encoder))
155+
// There is a tiny window between printing the incremental info above and encoding the dep
156+
// graph below in which the dep graph could change, thus making the printed incremental info
157+
// slightly out of date. If this matters to you, please feel free to submit a patch. :)
158+
159+
tcx.sess.time("incr_comp_encode_serialized_dep_graph", || tcx.dep_graph.encode(encoder))
228160
}
229161

230162
fn encode_work_product_index(

0 commit comments

Comments
 (0)