Auto merge of #107529 - Zoxc:inline-tweak-profile, r=cjgillot

Optimize query_cache_hit to reduce code size of the query hot path.

A small tweak which improves performance on check builds by 0.33% and reduces `rustc_driver` size by 1%.
<table><tr><td rowspan="2">Benchmark</td><td colspan="1"><b>Before</b></th><td colspan="2"><b>Before</b></th><td colspan="2"><b>After</b></th></tr><tr><td align="right">Time</td><td align="right">Time</td><td align="right">%</th><td align="right">Time</td><td align="right">%</th></tr><tr><td>🟣 <b>clap</b>:check</td><td align="right">1.7978s</td><td align="right">1.7980s</td><td align="right"> 0.01%</td><td align="right">1.7930s</td><td align="right"> -0.27%</td></tr><tr><td>🟣 <b>hyper</b>:check</td><td align="right">0.2594s</td><td align="right">0.2591s</td><td align="right"> -0.12%</td><td align="right">0.2592s</td><td align="right"> -0.09%</td></tr><tr><td>🟣 <b>syntex_syntax</b>:check</td><td align="right">6.2522s</td><td align="right">6.2540s</td><td align="right"> 0.03%</td><td align="right">6.2358s</td><td align="right"> -0.26%</td></tr><tr><td>🟣 <b>syn</b>:check</td><td align="right">1.5889s</td><td align="right">1.5880s</td><td align="right"> -0.05%</td><td align="right">1.5799s</td><td align="right"> -0.57%</td></tr><tr><td>🟣 <b>regex</b>:check</td><td align="right">0.9941s</td><td align="right">0.9939s</td><td align="right"> -0.02%</td><td align="right">0.9893s</td><td align="right"> -0.49%</td></tr><tr><td>Total</td><td align="right">10.8925s</td><td align="right">10.8930s</td><td align="right"> 0.01%</td><td align="right">10.8572s</td><td align="right"> -0.32%</td></tr><tr><td>Summary</td><td align="right">1.0000s</td><td align="right">0.9997s</td><td align="right"> -0.03%</td><td align="right">0.9967s</td><td align="right"> -0.33%</td></tr></table>

r? `@cjgillot`
This commit is contained in:
bors 2023-02-08 10:35:46 +00:00
commit a00e24d76a
4 changed files with 26 additions and 28 deletions

View file

@ -11,6 +11,7 @@
#![feature(associated_type_bounds)] #![feature(associated_type_bounds)]
#![feature(auto_traits)] #![feature(auto_traits)]
#![feature(cell_leak)] #![feature(cell_leak)]
#![feature(core_intrinsics)]
#![feature(extend_one)] #![feature(extend_one)]
#![feature(hash_raw_entry)] #![feature(hash_raw_entry)]
#![feature(hasher_prefixfree_extras)] #![feature(hasher_prefixfree_extras)]

View file

@ -88,6 +88,7 @@ use std::borrow::Borrow;
use std::collections::hash_map::Entry; use std::collections::hash_map::Entry;
use std::error::Error; use std::error::Error;
use std::fs; use std::fs;
use std::intrinsics::unlikely;
use std::path::Path; use std::path::Path;
use std::process; use std::process;
use std::sync::Arc; use std::sync::Arc;
@ -395,11 +396,18 @@ impl SelfProfilerRef {
/// Record a query in-memory cache hit. /// Record a query in-memory cache hit.
#[inline(always)] #[inline(always)]
pub fn query_cache_hit(&self, query_invocation_id: QueryInvocationId) { pub fn query_cache_hit(&self, query_invocation_id: QueryInvocationId) {
self.instant_query_event( #[inline(never)]
|profiler| profiler.query_cache_hit_event_kind, #[cold]
query_invocation_id, fn cold_call(profiler_ref: &SelfProfilerRef, query_invocation_id: QueryInvocationId) {
EventFilter::QUERY_CACHE_HITS, profiler_ref.instant_query_event(
); |profiler| profiler.query_cache_hit_event_kind,
query_invocation_id,
);
}
if unlikely(self.event_filter_mask.contains(EventFilter::QUERY_CACHE_HITS)) {
cold_call(self, query_invocation_id);
}
} }
/// Start profiling a query being blocked on a concurrent execution. /// Start profiling a query being blocked on a concurrent execution.
@ -444,20 +452,15 @@ impl SelfProfilerRef {
&self, &self,
event_kind: fn(&SelfProfiler) -> StringId, event_kind: fn(&SelfProfiler) -> StringId,
query_invocation_id: QueryInvocationId, query_invocation_id: QueryInvocationId,
event_filter: EventFilter,
) { ) {
drop(self.exec(event_filter, |profiler| { let event_id = StringId::new_virtual(query_invocation_id.0);
let event_id = StringId::new_virtual(query_invocation_id.0); let thread_id = get_thread_id();
let thread_id = get_thread_id(); let profiler = self.profiler.as_ref().unwrap();
profiler.profiler.record_instant_event(
profiler.profiler.record_instant_event( event_kind(profiler),
event_kind(profiler), EventId::from_virtual(event_id),
EventId::from_virtual(event_id), thread_id,
thread_id, );
);
TimingGuard::none()
}));
} }
pub fn with_profiler(&self, f: impl FnOnce(&SelfProfiler)) { pub fn with_profiler(&self, f: impl FnOnce(&SelfProfiler)) {

View file

@ -47,7 +47,7 @@ impl DepNodeIndex {
} }
impl From<DepNodeIndex> for QueryInvocationId { impl From<DepNodeIndex> for QueryInvocationId {
#[inline] #[inline(always)]
fn from(dep_node_index: DepNodeIndex) -> Self { fn from(dep_node_index: DepNodeIndex) -> Self {
QueryInvocationId(dep_node_index.as_u32()) QueryInvocationId(dep_node_index.as_u32())
} }

View file

@ -346,9 +346,7 @@ where
{ {
match cache.lookup(&key) { match cache.lookup(&key) {
Some((value, index)) => { Some((value, index)) => {
if std::intrinsics::unlikely(tcx.profiler().enabled()) { tcx.profiler().query_cache_hit(index.into());
tcx.profiler().query_cache_hit(index.into());
}
tcx.dep_graph().read_index(index); tcx.dep_graph().read_index(index);
Some(value) Some(value)
} }
@ -408,9 +406,7 @@ where
panic!("value must be in cache after waiting") panic!("value must be in cache after waiting")
}; };
if std::intrinsics::unlikely(qcx.dep_context().profiler().enabled()) { qcx.dep_context().profiler().query_cache_hit(index.into());
qcx.dep_context().profiler().query_cache_hit(index.into());
}
query_blocked_prof_timer.finish_with_query_invocation_id(index.into()); query_blocked_prof_timer.finish_with_query_invocation_id(index.into());
(v, Some(index)) (v, Some(index))
@ -776,9 +772,7 @@ where
// Ensure that only one of them runs the query. // Ensure that only one of them runs the query.
let cache = Q::query_cache(qcx); let cache = Q::query_cache(qcx);
if let Some((_, index)) = cache.lookup(&key) { if let Some((_, index)) = cache.lookup(&key) {
if std::intrinsics::unlikely(qcx.dep_context().profiler().enabled()) { qcx.dep_context().profiler().query_cache_hit(index.into());
qcx.dep_context().profiler().query_cache_hit(index.into());
}
return; return;
} }