From d89dd24f0a3993ed10b00957f947b65d91b00ffc Mon Sep 17 00:00:00 2001 From: boris Date: Sat, 5 Sep 2026 05:47:11 +0800 Subject: [PATCH] perf: isolate ordered selection hot path --- .../fidc-core/src/platform_expr_strategy.rs | 110 +++++++++++------- 1 file changed, 70 insertions(+), 40 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 25f3a87..dccdd90 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -10122,46 +10122,18 @@ impl PlatformExprStrategy { // complete ranking for replacement limiting, select directly from the // ordered stream instead of materializing a second candidate vector. if self.rank_reuses_market_cap_order() && self.config.daily_replacement_limit == 0 { - let execution_day = ctx.data.daily_snapshot_view(date); - let universe_factor_day = ctx.data.daily_snapshot_view(universe_factor_date); - let factor_day = ctx.data.daily_snapshot_view(stock_factor_date); - let mut selected = Vec::with_capacity(limit.min(universe_symbol_ids.len())); - for symbol_id in universe_symbol_ids { - let factor = universe_factor_day - .factor(symbol_id) - .expect("market-cap order references missing factor row"); - let symbol = factor.symbol.as_str(); - let stock = self.uncached_selection_stock_state_from_views_by_symbol_id( - ctx, - date, - stock_factor_date, - symbol_id, - symbol, - &execution_day, - &factor_day, - )?; - let field_value = self.selection_field_value_from_caps( - decision_market_cap_bn(factor), - decision_free_float_cap_bn(factor), - &stock, - ); - if !field_value.is_finite() || field_value < band_low || field_value > band_high { - continue; - } - if self.selection_candidate_passes_filters( - ctx, - date, - day, - symbol, - &stock, - &mut diagnostics, - )? { - selected.push(factor.symbol.clone()); - if selected.len() >= limit { - break; - } - } - } + let selected = self.select_market_cap_ordered_symbols( + ctx, + date, + universe_factor_date, + stock_factor_date, + day, + band_low, + band_high, + limit, + universe_symbol_ids, + &mut diagnostics, + )?; return Ok((selected, diagnostics, risk_decisions)); } @@ -10180,6 +10152,64 @@ impl PlatformExprStrategy { Ok((selected, diagnostics, risk_decisions)) } + #[inline(never)] + #[allow(clippy::too_many_arguments)] + fn select_market_cap_ordered_symbols( + &self, + ctx: &StrategyContext<'_>, + date: NaiveDate, + universe_factor_date: NaiveDate, + stock_factor_date: NaiveDate, + day: &DayExpressionState, + band_low: f64, + band_high: f64, + limit: usize, + universe_symbol_ids: Vec, + diagnostics: &mut Vec, + ) -> Result, BacktestError> { + let execution_day = ctx.data.daily_snapshot_view(date); + let universe_factor_day = ctx.data.daily_snapshot_view(universe_factor_date); + let factor_day = ctx.data.daily_snapshot_view(stock_factor_date); + let mut selected = Vec::with_capacity(limit.min(universe_symbol_ids.len())); + for symbol_id in universe_symbol_ids { + let factor = universe_factor_day + .factor(symbol_id) + .expect("market-cap order references missing factor row"); + let symbol = factor.symbol.as_str(); + let stock = self.uncached_selection_stock_state_from_views_by_symbol_id( + ctx, + date, + stock_factor_date, + symbol_id, + symbol, + &execution_day, + &factor_day, + )?; + let field_value = self.selection_field_value_from_caps( + decision_market_cap_bn(factor), + decision_free_float_cap_bn(factor), + &stock, + ); + if !field_value.is_finite() || field_value < band_low || field_value > band_high { + continue; + } + if self.selection_candidate_passes_filters( + ctx, + date, + day, + symbol, + &stock, + diagnostics, + )? { + selected.push(factor.symbol.clone()); + if selected.len() >= limit { + break; + } + } + } + Ok(selected) + } + #[inline(never)] #[allow(clippy::too_many_arguments)] fn select_ranked_symbols(