Skip to content

Commit cbc579e

Browse files
committed
Auto merge of rust-lang#16643 - Veykril:salsa-opt, r=Veykril
internal: Optimize salsa memory usage Reduces memory on self by ~20mb for me, there is a few more mb to save here if we made LRU caching opt-in, as currently every entry in a memoized query will store an `AtomicUsize` for the LRU.
2 parents deddea0 + cc4d0e1 commit cbc579e

File tree

18 files changed

+174
-163
lines changed

18 files changed

+174
-163
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/ide-db/src/apply_change.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ impl RootDatabase {
1717
pub fn request_cancellation(&mut self) {
1818
let _p =
1919
tracing::span!(tracing::Level::INFO, "RootDatabase::request_cancellation").entered();
20-
self.salsa_runtime_mut().synthetic_write(Durability::LOW);
20+
self.synthetic_write(Durability::LOW);
2121
}
2222

2323
pub fn apply_change(&mut self, change: Change) {

crates/salsa/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ rustc-hash = "1.0"
2121
smallvec = "1.0.0"
2222
oorandom = "11"
2323
triomphe = "0.1.11"
24+
itertools.workspace = true
2425

2526
salsa-macros = { version = "0.0.0", path = "salsa-macros" }
2627

crates/salsa/salsa-macros/src/database_storage.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ pub(crate) fn database(args: TokenStream, input: TokenStream) -> TokenStream {
154154
self.#db_storage_field.salsa_runtime()
155155
}
156156

157-
fn ops_salsa_runtime_mut(&mut self) -> &mut salsa::Runtime {
158-
self.#db_storage_field.salsa_runtime_mut()
157+
fn synthetic_write(&mut self, durability: salsa::Durability) {
158+
self.#db_storage_field.salsa_runtime_mut().synthetic_write(durability)
159159
}
160160

161161
fn fmt_index(

crates/salsa/salsa-macros/src/query_group.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -526,7 +526,7 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
526526
fmt_ops.extend(quote! {
527527
#query_index => {
528528
salsa::plumbing::QueryStorageOps::fmt_index(
529-
&*self.#fn_name, db, input, fmt,
529+
&*self.#fn_name, db, input.key_index(), fmt,
530530
)
531531
}
532532
});
@@ -537,7 +537,7 @@ pub(crate) fn query_group(args: TokenStream, input: TokenStream) -> TokenStream
537537
maybe_changed_ops.extend(quote! {
538538
#query_index => {
539539
salsa::plumbing::QueryStorageOps::maybe_changed_after(
540-
&*self.#fn_name, db, input, revision
540+
&*self.#fn_name, db, input.key_index(), revision
541541
)
542542
}
543543
});

crates/salsa/src/derived.rs

+12-13
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,13 @@ where
102102

103103
let mut write = self.slot_map.write();
104104
let entry = write.entry(key.clone());
105-
let key_index = u32::try_from(entry.index()).unwrap();
105+
let key_index = entry.index() as u32;
106106
let database_key_index = DatabaseKeyIndex {
107107
group_index: self.group_index,
108108
query_index: Q::QUERY_INDEX,
109109
key_index,
110110
};
111-
entry.or_insert_with(|| Arc::new(Slot::new(key.clone(), database_key_index))).clone()
111+
entry.or_insert_with(|| Arc::new(Slot::new(database_key_index))).clone()
112112
}
113113
}
114114

@@ -131,34 +131,33 @@ where
131131
fn fmt_index(
132132
&self,
133133
_db: &<Q as QueryDb<'_>>::DynDb,
134-
index: DatabaseKeyIndex,
134+
index: u32,
135135
fmt: &mut std::fmt::Formatter<'_>,
136136
) -> std::fmt::Result {
137-
assert_eq!(index.group_index, self.group_index);
138-
assert_eq!(index.query_index, Q::QUERY_INDEX);
139137
let slot_map = self.slot_map.read();
140-
let key = slot_map.get_index(index.key_index as usize).unwrap().0;
138+
let key = slot_map.get_index(index as usize).unwrap().0;
141139
write!(fmt, "{}({:?})", Q::QUERY_NAME, key)
142140
}
143141

144142
fn maybe_changed_after(
145143
&self,
146144
db: &<Q as QueryDb<'_>>::DynDb,
147-
input: DatabaseKeyIndex,
145+
index: u32,
148146
revision: Revision,
149147
) -> bool {
150-
assert_eq!(input.group_index, self.group_index);
151-
assert_eq!(input.query_index, Q::QUERY_INDEX);
152148
debug_assert!(revision < db.salsa_runtime().current_revision());
153-
let slot = self.slot_map.read().get_index(input.key_index as usize).unwrap().1.clone();
154-
slot.maybe_changed_after(db, revision)
149+
let read = &self.slot_map.read();
150+
let Some((key, slot)) = read.get_index(index as usize) else {
151+
return false;
152+
};
153+
slot.maybe_changed_after(db, revision, key)
155154
}
156155

157156
fn fetch(&self, db: &<Q as QueryDb<'_>>::DynDb, key: &Q::Key) -> Q::Value {
158157
db.unwind_if_cancelled();
159158

160159
let slot = self.slot(key);
161-
let StampedValue { value, durability, changed_at } = slot.read(db);
160+
let StampedValue { value, durability, changed_at } = slot.read(db, key);
162161

163162
if let Some(evicted) = self.lru_list.record_use(&slot) {
164163
evicted.evict();
@@ -182,7 +181,7 @@ where
182181
C: std::iter::FromIterator<TableEntry<Q::Key, Q::Value>>,
183182
{
184183
let slot_map = self.slot_map.read();
185-
slot_map.values().filter_map(|slot| slot.as_table_entry()).collect()
184+
slot_map.iter().filter_map(|(key, slot)| slot.as_table_entry(key)).collect()
186185
}
187186
}
188187

0 commit comments

Comments
 (0)