Skip to main content

sol_parser_sdk/
warmup.rs

1//! 预热模块 - 消除首次调用的延迟
2//!
3//! 首次调用解析函数时会有额外延迟(10-50ms),原因:
4//! 1. rayon 线程池初始化
5//! 2. Lazy 静态变量(SIMD Finder)初始化
6//!
7//! 调用 `warmup_parser()` 可以预先初始化所有组件,消除首次解析的延迟。
8
9use std::sync::atomic::{AtomicBool, Ordering};
10
11/// 预热状态标记
12static WARMED_UP: AtomicBool = AtomicBool::new(false);
13
14/// 预热解析器
15///
16/// 建议在程序启动时调用,消除首次解析的延迟(约 10-50ms)
17///
18/// # 示例
19/// ```rust
20/// use sol_parser_sdk::warmup_parser;
21///
22/// fn main() {
23///     // 启动时预热
24///     warmup_parser();
25///     
26///     // 后续解析将没有初始化延迟
27/// }
28/// ```
29#[inline]
30pub fn warmup_parser() {
31    if WARMED_UP.swap(true, Ordering::SeqCst) {
32        return; // 已经预热过了
33    }
34
35    // 1. 预热 rayon 线程池
36    warmup_rayon();
37
38    // 2. 预热所有 Lazy 静态 SIMD Finder
39    warmup_simd_finders();
40
41    // 3. 预热 Base64 引擎
42    warmup_base64();
43}
44
45/// 预热 rayon 线程池
46#[inline]
47fn warmup_rayon() {
48    // 执行一个简单的并行任务来初始化线程池
49    rayon::join(|| {}, || {});
50}
51
52/// 预热所有 SIMD Finder
53#[inline]
54fn warmup_simd_finders() {
55    use memchr::memmem;
56
57    // 触发 optimized_matcher 中的所有 Lazy Finder 初始化
58    // 通过访问它们的内部数据来强制初始化
59    
60    // 使用一个虚拟日志来触发所有 Finder
61    let dummy_log = b"Program data: Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P invoke [1]";
62    
63    // 预热 logs/optimized_matcher.rs 中的所有 Finder
64    let _ = memmem::find(dummy_log, b"Program data: ");
65    let _ = memmem::find(dummy_log, b"6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P");
66    let _ = memmem::find(dummy_log, b"675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8");
67    let _ = memmem::find(dummy_log, b"invoke [");
68    let _ = memmem::find(dummy_log, b"Program");
69    let _ = memmem::find(dummy_log, b"pumpswap");
70    let _ = memmem::find(dummy_log, b"PumpSwap");
71    let _ = memmem::find(dummy_log, b"whirL");
72    let _ = memmem::find(dummy_log, b"meteora");
73    
74    // 触发 parse_invoke_info 来预热相关 Finder
75    let _ = crate::logs::optimized_matcher::parse_invoke_info(
76        "Program 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P invoke [1]"
77    );
78    
79    // 触发 detect_log_type 来预热类型检测
80    let _ = crate::logs::optimized_matcher::detect_log_type(
81        "Program data: test"
82    );
83}
84
85/// 预热 Base64 引擎
86#[inline]
87fn warmup_base64() {
88    use base64::Engine;
89    
90    // 解码一个小的 Base64 字符串来预热引擎
91    let mut buf = [0u8; 32];
92    let _ = base64::engine::general_purpose::STANDARD.decode_slice(
93        b"AAAAAAAAAAAAAAAA",
94        &mut buf
95    );
96}
97
98/// 检查是否已预热
99#[inline]
100pub fn is_warmed_up() -> bool {
101    WARMED_UP.load(Ordering::SeqCst)
102}
103
104#[cfg(test)]
105mod tests {
106    use super::*;
107
108    #[test]
109    fn test_warmup() {
110        assert!(!is_warmed_up());
111        warmup_parser();
112        assert!(is_warmed_up());
113        
114        // 再次调用应该是 no-op
115        warmup_parser();
116        assert!(is_warmed_up());
117    }
118}