//! 성능 측정 (기본 무시). 실행: //! ARCHIVE_PERF_DIR=<50k폴더> cargo test -p archive-indexer --release --test perf_scan -- --ignored --nocapture use archive_db::Db; use std::sync::atomic::AtomicBool; use std::sync::Arc; use std::time::Instant; #[test] #[ignore] fn scan_perf() { let Ok(dir) = std::env::var("ARCHIVE_PERF_DIR") else { eprintln!("ARCHIVE_PERF_DIR 미설정 — 건너뜀"); return; }; let dbdir = tempfile::tempdir().unwrap(); let db = Arc::new(Db::open(&dbdir.path().join("perf.db")).unwrap()); let root = std::path::Path::new(&dir); let cancel = AtomicBool::new(false); let dir_owned = dir.clone(); db.with_write(move |c| { c.execute("INSERT INTO sources(id,kind,name,root) VALUES(1,'local','perf',?1)", [&dir_owned])?; Ok(()) }) .unwrap(); // 1차 스캔 (전체) let t0 = Instant::now(); let stats = archive_indexer::pipeline::scan_source(&db, 1, root, &cancel, |_| {}).unwrap(); let scan1 = t0.elapsed(); // 메타데이터 let t1 = Instant::now(); let meta = archive_indexer::meta::extract_image_meta(&db, 1, &cancel).unwrap(); let meta_dur = t1.elapsed(); // 2차 스캔 (무변경 — 스냅샷 비교) let t2 = Instant::now(); let stats2 = archive_indexer::pipeline::scan_source(&db, 1, root, &cancel, |_| {}).unwrap(); let scan2 = t2.elapsed(); eprintln!("=== 성능 (릴리스) ==="); eprintln!("파일 수: {}", stats.seen); eprintln!("1차 스캔: {:.2}s ({} added)", scan1.as_secs_f64(), stats.added); eprintln!("메타 추출: {:.2}s ({} 이미지)", meta_dur.as_secs_f64(), meta); eprintln!("무변경 재스캔: {:.2}s (added={}, changed={})", scan2.as_secs_f64(), stats2.added, stats2.changed); assert_eq!(stats2.added, 0); assert_eq!(stats2.changed, 0); }