perf: isolate ordered selection hot path

This commit is contained in:
boris
2026-09-05 05:47:11 +08:00
parent 6a304e2fc2
commit d89dd24f0a
+47 -17
View File
@@ -10122,6 +10122,51 @@ impl PlatformExprStrategy {
// complete ranking for replacement limiting, select directly from the // complete ranking for replacement limiting, select directly from the
// ordered stream instead of materializing a second candidate vector. // ordered stream instead of materializing a second candidate vector.
if self.rank_reuses_market_cap_order() && self.config.daily_replacement_limit == 0 { if self.rank_reuses_market_cap_order() && self.config.daily_replacement_limit == 0 {
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));
}
let selected = self.select_ranked_symbols(
ctx,
date,
universe_factor_date,
stock_factor_date,
day,
band_low,
band_high,
limit,
universe_symbol_ids,
&mut diagnostics,
)?;
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<u32>,
diagnostics: &mut Vec<String>,
) -> Result<Vec<String>, BacktestError> {
let execution_day = ctx.data.daily_snapshot_view(date); let execution_day = ctx.data.daily_snapshot_view(date);
let universe_factor_day = ctx.data.daily_snapshot_view(universe_factor_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 factor_day = ctx.data.daily_snapshot_view(stock_factor_date);
@@ -10154,7 +10199,7 @@ impl PlatformExprStrategy {
day, day,
symbol, symbol,
&stock, &stock,
&mut diagnostics, diagnostics,
)? { )? {
selected.push(factor.symbol.clone()); selected.push(factor.symbol.clone());
if selected.len() >= limit { if selected.len() >= limit {
@@ -10162,22 +10207,7 @@ impl PlatformExprStrategy {
} }
} }
} }
return Ok((selected, diagnostics, risk_decisions)); Ok(selected)
}
let selected = self.select_ranked_symbols(
ctx,
date,
universe_factor_date,
stock_factor_date,
day,
band_low,
band_high,
limit,
universe_symbol_ids,
&mut diagnostics,
)?;
Ok((selected, diagnostics, risk_decisions))
} }
#[inline(never)] #[inline(never)]