From 840473362d7032b80d551ba5935723ee823dffa1 Mon Sep 17 00:00:00 2001 From: boris Date: Sun, 6 Sep 2026 17:37:12 +0800 Subject: [PATCH] perf: reuse expression scope identifiers and dates --- .../fidc-core/src/platform_expr_strategy.rs | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/crates/fidc-core/src/platform_expr_strategy.rs b/crates/fidc-core/src/platform_expr_strategy.rs index 2fd9a4a..36d23b0 100644 --- a/crates/fidc-core/src/platform_expr_strategy.rs +++ b/crates/fidc-core/src/platform_expr_strategy.rs @@ -4,7 +4,7 @@ use std::sync::Arc; use ahash::{AHashMap, AHashSet}; use chrono::{Datelike, Duration, NaiveDate, NaiveDateTime, NaiveTime, Timelike}; -use rhai::{AST, Dynamic, Engine, Map, Scope}; +use rhai::{AST, Dynamic, Engine, ImmutableString, Map, Scope}; use crate::broker::{MatchingType, RebalanceCashMode, SlippageModel}; use crate::cost::ChinaAShareCostModel; @@ -626,6 +626,9 @@ impl ProjectedOrderValueResult { #[derive(Debug, Clone)] struct DayExpressionState { date: NaiveDate, + trade_date_text: ImmutableString, + decision_date_text: ImmutableString, + execution_date_text: ImmutableString, signal_open: f64, signal_close: f64, benchmark_open: f64, @@ -925,13 +928,13 @@ impl<'a> SelectiveExpressionScope<'a> { fn push>(&mut self, name: &str, value: T) -> &mut Self { if self.requires(name) { - self.inner.push_dynamic(name.to_string(), value.into()); + self.inner.push_dynamic(name, value.into()); } self } fn push_required>(&mut self, name: &str, value: T) -> &mut Self { - self.inner.push_dynamic(name.to_string(), value.into()); + self.inner.push_dynamic(name, value.into()); self } @@ -3895,6 +3898,9 @@ impl PlatformExprStrategy { Ok(DayExpressionState { date, + trade_date_text: date.to_string().into(), + decision_date_text: ctx.decision_date.to_string().into(), + execution_date_text: ctx.execution_date.to_string().into(), signal_open, signal_close, benchmark_open, @@ -4541,14 +4547,11 @@ impl PlatformExprStrategy { include_process_event_counts: bool, ) -> Scope<'static> { let mut scope = SelectiveExpressionScope::new(scope_identifiers); - let trade_date = day.date.format("%Y-%m-%d").to_string(); - let decision_date = ctx.decision_date.format("%Y-%m-%d").to_string(); - let execution_date = ctx.execution_date.format("%Y-%m-%d").to_string(); - scope.push("trade_date", trade_date.clone()); - scope.push("current_date", trade_date.clone()); - scope.push("date", trade_date); - scope.push("decision_date", decision_date); - scope.push("execution_date", execution_date); + scope.push("trade_date", day.trade_date_text.clone()); + scope.push("current_date", day.trade_date_text.clone()); + scope.push("date", day.trade_date_text.clone()); + scope.push("decision_date", day.decision_date_text.clone()); + scope.push("execution_date", day.execution_date_text.clone()); scope.push("signal_open", day.signal_open); scope.push("signal_close", day.signal_close); scope.push("benchmark_open", day.benchmark_open);