From ecd1cf45e9ccb45d40881aec5e235353cd7d9ab6 Mon Sep 17 00:00:00 2001 From: Jarrett Ye Date: Wed, 17 Sep 2025 12:28:24 +0800 Subject: [PATCH 1/2] 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. --- rslib/src/scheduler/fsrs/params.rs | 34 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/rslib/src/scheduler/fsrs/params.rs b/rslib/src/scheduler/fsrs/params.rs index 726870fe1..ff31b85f2 100644 --- a/rslib/src/scheduler/fsrs/params.rs +++ b/rslib/src/scheduler/fsrs/params.rs @@ -481,24 +481,22 @@ pub(crate) fn reviews_for_fsrs( let skip = if training { 1 } else { 0 }; // Convert the remaining entries into separate FSRSItems, where each item // contains all reviews done until then. - let items: Vec<(RevlogId, FSRSItem)> = entries - .iter() - .enumerate() - .skip(skip) - .map(|(outer_idx, entry)| { - let reviews = entries - .iter() - .take(outer_idx + 1) - .enumerate() - .map(|(inner_idx, r)| FSRSReview { - rating: r.button_chosen as u32, - delta_t: delta_ts[inner_idx], - }) - .collect(); - (entry.id, FSRSItem { reviews }) - }) - .filter(|(_, item)| !training || item.reviews.last().unwrap().delta_t > 0) - .collect_vec(); + let mut items = Vec::with_capacity(entries.len()); + let mut current_reviews = Vec::with_capacity(entries.len()); + for (idx, (entry, &delta_t)) in entries.iter().zip(delta_ts.iter()).enumerate() { + current_reviews.push(FSRSReview { + rating: entry.button_chosen as u32, + delta_t, + }); + if idx >= skip { + if !training || current_reviews.last().unwrap().delta_t > 0 { + let item = FSRSItem { + reviews: current_reviews.clone(), + }; + items.push((entry.id, item)); + } + } + } if items.is_empty() { None } else { From 38990fe68dbefb8466ce90af26448b94907097e7 Mon Sep 17 00:00:00 2001 From: Jarrett Ye Date: Wed, 17 Sep 2025 13:38:05 +0800 Subject: [PATCH 2/2] collapse `if` statement --- rslib/src/scheduler/fsrs/params.rs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rslib/src/scheduler/fsrs/params.rs b/rslib/src/scheduler/fsrs/params.rs index ff31b85f2..df1ec15bb 100644 --- a/rslib/src/scheduler/fsrs/params.rs +++ b/rslib/src/scheduler/fsrs/params.rs @@ -488,13 +488,11 @@ pub(crate) fn reviews_for_fsrs( rating: entry.button_chosen as u32, delta_t, }); - if idx >= skip { - if !training || current_reviews.last().unwrap().delta_t > 0 { - let item = FSRSItem { - reviews: current_reviews.clone(), - }; - items.push((entry.id, item)); - } + if idx >= skip && (!training || current_reviews.last().unwrap().delta_t > 0) { + let item = FSRSItem { + reviews: current_reviews.clone(), + }; + items.push((entry.id, item)); } } if items.is_empty() {