[self-profiling] Include the estimated size of each cgu in the profile
This is helpful when looking for CGUs where the size estimate isn't a good indicator of compilation time. I verified that moving the profiling timer call doesn't affect the results.
This commit is contained in:
parent
338f939a8d
commit
efe703a01a
@ -97,14 +97,12 @@ pub fn compile_codegen_unit(
|
||||
tcx: TyCtxt<'tcx>,
|
||||
cgu_name: Symbol,
|
||||
) -> (ModuleCodegen<ModuleLlvm>, u64) {
|
||||
let prof_timer = tcx.prof.generic_activity_with_arg("codegen_module", cgu_name.to_string());
|
||||
let start_time = Instant::now();
|
||||
|
||||
let dep_node = tcx.codegen_unit(cgu_name).codegen_dep_node(tcx);
|
||||
let (module, _) =
|
||||
tcx.dep_graph.with_task(dep_node, tcx, cgu_name, module_codegen, dep_graph::hash_result);
|
||||
let time_to_codegen = start_time.elapsed();
|
||||
drop(prof_timer);
|
||||
|
||||
// We assume that the cost to run LLVM on a CGU is proportional to
|
||||
// the time we needed for codegenning it.
|
||||
@ -112,6 +110,10 @@ pub fn compile_codegen_unit(
|
||||
|
||||
fn module_codegen(tcx: TyCtxt<'_>, cgu_name: Symbol) -> ModuleCodegen<ModuleLlvm> {
|
||||
let cgu = tcx.codegen_unit(cgu_name);
|
||||
let _prof_timer = tcx.prof.generic_activity_with_args(
|
||||
"codegen_module",
|
||||
&[cgu_name.to_string(), cgu.size_estimate().to_string()],
|
||||
);
|
||||
// Instantiate monomorphizations without filling out definitions yet...
|
||||
let llvm_module = ModuleLlvm::new(tcx, &cgu_name.as_str());
|
||||
{
|
||||
|
@ -272,6 +272,28 @@ impl SelfProfilerRef {
|
||||
})
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn generic_activity_with_args(
|
||||
&self,
|
||||
event_label: &'static str,
|
||||
event_args: &[String],
|
||||
) -> TimingGuard<'_> {
|
||||
self.exec(EventFilter::GENERIC_ACTIVITIES, |profiler| {
|
||||
let builder = EventIdBuilder::new(&profiler.profiler);
|
||||
let event_label = profiler.get_or_alloc_cached_string(event_label);
|
||||
let event_id = if profiler.event_filter_mask.contains(EventFilter::FUNCTION_ARGS) {
|
||||
let event_args: Vec<_> = event_args
|
||||
.iter()
|
||||
.map(|s| profiler.get_or_alloc_cached_string(&s[..]))
|
||||
.collect();
|
||||
builder.from_label_and_args(event_label, &event_args)
|
||||
} else {
|
||||
builder.from_label(event_label)
|
||||
};
|
||||
TimingGuard::start(profiler, profiler.generic_activity_event_kind, event_id)
|
||||
})
|
||||
}
|
||||
|
||||
/// Start profiling a query provider. Profiling continues until the
|
||||
/// TimingGuard returned from this call is dropped.
|
||||
#[inline(always)]
|
||||
|
Loading…
Reference in New Issue
Block a user