File size: 2,234 Bytes
9bd4ce5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#[cfg(test)]
mod tests {
    use crate::core::logic::card_db::CardDatabase;
    use crate::core::logic::card_db::MemberCard;
    use crate::core::logic::filter::CardFilter;
    use crate::core::logic::models::AbilityContext;
    use crate::core::logic::GameState;
    use std::time::Instant;

    #[test]
    fn test_filter_performance_baseline() {
        let mut db = CardDatabase::default();
        
        // Create 100 member cards with names
        for i in 1..=100 {
            let mut m = MemberCard::default();
            m.card_id = i;
            m.name = format!("Member {}", i);
            if i % 10 == 0 {
                m.name = "優木せつ菜".to_string();
            } else if i % 5 == 0 {
                m.name = "澁谷かのん".to_string();
            }
            m.normalized_name = m.name.replace(" ", "");
            db.enrich_member(&mut m);
            db.members.insert(i, m.clone());
            let lid = CardDatabase::to_logic_id(i);
            db.members_vec[lid] = Some(m);
        }

        let state = GameState::default();
        let ctx = AbilityContext::default();
        
        // Create a filter for "せつ菜" (Character ID 27)
        let filter = CardFilter::from_attr(map_char_id_to_filter_attr(27));
        
        println!("Starting benchmark with character filter...");
        let start = Instant::now();
        let iterations = 100_000;
        let mut match_count = 0;
        
        for _ in 0..iterations {
            for cid in 1..=100 {
                if filter.matches(&state, &db, cid, None, false, None, &ctx) {
                    match_count += 1;
                }
            }
        }
        
        let duration = start.elapsed();
        println!("Completed {} iterations ({} total checks) in {:?}", iterations, iterations * 100, duration);
        println!("Average time per match check: {:?}", duration / (iterations as u32 * 100));
        assert!(match_count > 0);
    }

    fn map_char_id_to_filter_attr(char_id: u8) -> i64 {
        // Simple mock of from_attr logic for character ID 1
        let mut a: u64 = 0;
        // Bits 39-45: Character ID #1 (7 bits)
        a |= (char_id as u64 & 0x7F) << 39;
        a as i64
    }
}