revert: remove unproven duplicate rolling reuse
This commit is contained in:
@@ -688,17 +688,7 @@ impl AdjustedCloseSeries {
|
||||
end: usize,
|
||||
lookbacks: &[usize; N],
|
||||
) -> [Option<f64>; N] {
|
||||
let mut values = [None; N];
|
||||
for index in 0..N {
|
||||
if let Some(previous) =
|
||||
(0..index).find(|previous| lookbacks[*previous] == lookbacks[index])
|
||||
{
|
||||
values[index] = values[previous];
|
||||
} else {
|
||||
values[index] = self.moving_average_at_end(end, lookbacks[index]);
|
||||
}
|
||||
}
|
||||
values
|
||||
std::array::from_fn(|index| self.moving_average_at_end(end, lookbacks[index]))
|
||||
}
|
||||
|
||||
fn moving_average_at_end(&self, end: usize, lookback: usize) -> Option<f64> {
|
||||
@@ -5409,82 +5399,6 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore = "manual release-mode duplicate rolling lookback benchmark"]
|
||||
fn benchmark_adjusted_close_reuses_duplicate_lookbacks() {
|
||||
use std::hint::black_box;
|
||||
use std::time::Instant;
|
||||
|
||||
let data = adjusted_close_benchmark_data();
|
||||
let symbol_id = data.symbol_id("000001.SZ").expect("symbol id");
|
||||
let series = data
|
||||
.adjusted_close_series_by_symbol_id(symbol_id)
|
||||
.expect("adjusted close series");
|
||||
let lookbacks = [1usize, 2, 3, 1, 2, 3, 1];
|
||||
let end = 3usize;
|
||||
let iterations = 3_000_000usize;
|
||||
let mut repeated_nanos = 0u128;
|
||||
let mut reused_nanos = 0u128;
|
||||
let mut repeated_checksum = 0.0;
|
||||
let mut reused_checksum = 0.0;
|
||||
|
||||
for sample in 0..6 {
|
||||
let measure_repeated = || {
|
||||
let started = Instant::now();
|
||||
let mut checksum = 0.0;
|
||||
for _ in 0..iterations {
|
||||
let values = std::array::from_fn::<_, 7, _>(|index| {
|
||||
series.moving_average_at_end(black_box(end), black_box(lookbacks[index]))
|
||||
});
|
||||
checksum += black_box(values).into_iter().flatten().sum::<f64>();
|
||||
}
|
||||
(started.elapsed().as_nanos(), checksum)
|
||||
};
|
||||
let measure_reused = || {
|
||||
let started = Instant::now();
|
||||
let mut checksum = 0.0;
|
||||
for _ in 0..iterations {
|
||||
checksum += black_box(
|
||||
series.moving_averages_at_end(black_box(end), black_box(&lookbacks)),
|
||||
)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.sum::<f64>();
|
||||
}
|
||||
(started.elapsed().as_nanos(), checksum)
|
||||
};
|
||||
let (baseline, candidate) = if sample % 2 == 0 {
|
||||
(measure_repeated(), measure_reused())
|
||||
} else {
|
||||
let candidate = measure_reused();
|
||||
let baseline = measure_repeated();
|
||||
(baseline, candidate)
|
||||
};
|
||||
repeated_nanos += baseline.0;
|
||||
repeated_checksum += baseline.1;
|
||||
reused_nanos += candidate.0;
|
||||
reused_checksum += candidate.1;
|
||||
}
|
||||
|
||||
assert_eq!(repeated_checksum, reused_checksum);
|
||||
assert!(repeated_checksum > 0.0);
|
||||
let repeated_seconds = repeated_nanos as f64 / 1_000_000_000.0;
|
||||
let reused_seconds = reused_nanos as f64 / 1_000_000_000.0;
|
||||
eprintln!(
|
||||
"{}",
|
||||
serde_json::json!({
|
||||
"schemaVersion": "fidc-adjusted-close-duplicate-lookback-benchmark/v1",
|
||||
"samples": 6,
|
||||
"iterationsPerSample": iterations,
|
||||
"lookbacks": lookbacks,
|
||||
"repeatedSeconds": repeated_seconds,
|
||||
"reusedSeconds": reused_seconds,
|
||||
"speedup": repeated_seconds / reused_seconds,
|
||||
"checksum": repeated_checksum,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore = "manual component benchmark"]
|
||||
fn benchmark_daily_snapshot_view_lookup() {
|
||||
@@ -5876,58 +5790,6 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
fn adjusted_close_benchmark_data() -> DataSet {
|
||||
let dates = [
|
||||
NaiveDate::from_ymd_opt(2025, 1, 2).unwrap(),
|
||||
NaiveDate::from_ymd_opt(2025, 1, 3).unwrap(),
|
||||
NaiveDate::from_ymd_opt(2025, 1, 6).unwrap(),
|
||||
];
|
||||
DataSet::from_components(
|
||||
vec![Instrument {
|
||||
symbol: "000001.SZ".to_string(),
|
||||
name: "000001.SZ".to_string(),
|
||||
board: "SZ".to_string(),
|
||||
round_lot: 100,
|
||||
listed_at: None,
|
||||
delisted_at: None,
|
||||
status: "active".to_string(),
|
||||
}],
|
||||
dates
|
||||
.iter()
|
||||
.enumerate()
|
||||
.map(|(index, date)| {
|
||||
market_row(
|
||||
&date.format("%Y-%m-%d").to_string(),
|
||||
10.0 + index as f64,
|
||||
100_000,
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
dates
|
||||
.iter()
|
||||
.map(|date| DailyFactorSnapshot {
|
||||
date: *date,
|
||||
symbol: "000001.SZ".to_string(),
|
||||
market_cap_bn: 10.0,
|
||||
free_float_cap_bn: 8.0,
|
||||
pe_ttm: 10.0,
|
||||
turnover_ratio: None,
|
||||
effective_turnover_ratio: None,
|
||||
extra_factors: NumericFactorMap::from([(
|
||||
Cow::Borrowed(BACKWARD_ADJUSTMENT_FACTOR_FIELD),
|
||||
1.0,
|
||||
)]),
|
||||
})
|
||||
.collect(),
|
||||
Vec::new(),
|
||||
dates
|
||||
.iter()
|
||||
.map(|date| benchmark_row(&date.format("%Y-%m-%d").to_string(), 1_000.0))
|
||||
.collect(),
|
||||
)
|
||||
.expect("adjusted close benchmark dataset")
|
||||
}
|
||||
|
||||
fn volume_contract_data(availability: Option<[f64; 3]>) -> DataSet {
|
||||
let dates = [
|
||||
NaiveDate::parse_from_str("2025-01-02", "%Y-%m-%d").unwrap(),
|
||||
|
||||
Reference in New Issue
Block a user