Compare commits

...

4 commits

Author SHA1 Message Date
Jarrett Ye
2f62fb8dd1
Merge 1afc7e35ca into 3890e12c9e 2025-09-17 14:51:58 +08:00
Jarrett Ye
1afc7e35ca
Merge branch 'main' into Refactor-reviews_for_fsrs-function-for-improved-performance 2025-09-17 13:43:13 +08:00
Jarrett Ye
38990fe68d
collapse if statement 2025-09-17 13:38:05 +08:00
Jarrett Ye
ecd1cf45e9
Refactor reviews_for_fsrs function for improved performance
Replaced the previous implementation with a more efficient approach using a single loop and pre-allocated vectors. This change reduces the complexity of creating FSRSItems and enhances overall performance, especially for larger datasets.
2025-09-17 12:28:24 +08:00

View file

@ -481,24 +481,20 @@ pub(crate) fn reviews_for_fsrs(
let skip = if training { 1 } else { 0 }; let skip = if training { 1 } else { 0 };
// Convert the remaining entries into separate FSRSItems, where each item // Convert the remaining entries into separate FSRSItems, where each item
// contains all reviews done until then. // contains all reviews done until then.
let items: Vec<(RevlogId, FSRSItem)> = entries let mut items = Vec::with_capacity(entries.len());
.iter() let mut current_reviews = Vec::with_capacity(entries.len());
.enumerate() for (idx, (entry, &delta_t)) in entries.iter().zip(delta_ts.iter()).enumerate() {
.skip(skip) current_reviews.push(FSRSReview {
.map(|(outer_idx, entry)| { rating: entry.button_chosen as u32,
let reviews = entries delta_t,
.iter() });
.take(outer_idx + 1) if idx >= skip && (!training || current_reviews.last().unwrap().delta_t > 0) {
.enumerate() let item = FSRSItem {
.map(|(inner_idx, r)| FSRSReview { reviews: current_reviews.clone(),
rating: r.button_chosen as u32, };
delta_t: delta_ts[inner_idx], items.push((entry.id, item));
}) }
.collect(); }
(entry.id, FSRSItem { reviews })
})
.filter(|(_, item)| !training || item.reviews.last().unwrap().delta_t > 0)
.collect_vec();
if items.is_empty() { if items.is_empty() {
None None
} else { } else {