
백테스트 시, 시각적으로 전략을 디버깅하기 위해서 웹페이지에 백테스트 결과를 차트에 그려넣으려고 한다. 하나의 응답에 캔들을 포함한 모든 데이터를 포함했다. 속도가 너무 느려서 이를 개선하고자 한다.
| 구분 | 캔들 수 (1분봉) | 변경 전 (AoS) | 변경 후 (SoA) | 성능 향상 (절감 시간) |
|---|---|---|---|---|
| Case 1 | 86,400개 | 3.22s | 2.56s | ⚡ 0.66s (약 20.5%↓) |
| Case 2 | 540,000개 | 20.55s | 15.52s | ⚡ 5.03s (약 24.5%↓) |
// 이전 구조체
/// 백테스트 최종 결과
#[derive(Debug, Clone)]
pub struct BackTestResult {
pub metrics: PerformanceMetrics,
pub trades: Vec<TradeRecordInternal>,
pub equity_curve: Vec<EquityCurveData>,
pub signals: Vec<SignalRecordInternal>,
pub candles: Vec<CandleData>, // ✅ 모든 캔들 데이터 포함
}
// 변경 구조체
/// 백테스트 최종 결과
#[derive(Debug, Clone)]
pub struct BackTestResult {
pub metrics: PerformanceMetrics,
pub trades: Vec<TradeRecordInternal>,
pub equity_curve: Vec<EquityCurveData>,
pub signals: Vec<SignalRecordInternal>,
pub flattened_candles: FlattenedCandles, // ✅ 모든 캔들 데이터 포함
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct FlattenedCandles {
pub times: Vec<i64>,
pub opens: Vec<f64>,
pub highs: Vec<f64>,
pub lows: Vec<f64>,
pub closes: Vec<f64>,
pub volumes: Vec<f64>,
}
impl From<Vec<Candle>> for FlattenedCandles {
fn from(candles: Vec<Candle>) -> Self {
let len = candles.len();
// 메모리를 미리 할당하여 성능 최적화 (중요!)
let mut times = Vec::with_capacity(len);
let mut opens = Vec::with_capacity(len);
let mut highs = Vec::with_capacity(len);
let mut lows = Vec::with_capacity(len);
let mut closes = Vec::with_capacity(len);
let mut volumes = Vec::with_capacity(len);
for c in candles {
times.push(c.open_time.timestamp_millis());
opens.push(c.open);
highs.push(c.high);
lows.push(c.low);
closes.push(c.close);
volumes.push(c.volume);
}
Self { times, opens, highs, lows, closes, volumes }
}
}








현재 프로토타입으로 빠르게 만들고 있으므로 응답에 다 때려 박았는데 이것도 최적화해야 한다. 먼저 최적화된 인프라를 구축한 다음에 빠르게 전략을 만들어볼 예정이다.
아무리 그래도 15초가 걸리는건 좀 아닌거 같은데... ai...
