pub struct DeviceManager {
pub reader: Reader,
pub last_load_time: Option<Duration>,
/* private fields */
}
Fields§
§reader: Reader
§last_load_time: Option<Duration>
Implementations§
Source§impl DeviceManager
impl DeviceManager
pub fn new(filename: &str) -> Result<Self, Error>
pub fn new_with_cache_size( filename: &str, max_cache_size: usize, ) -> Result<Self, Error>
Sourcepub fn match_device(&self, user_agent: &str) -> Device<'_>
pub fn match_device(&self, user_agent: &str) -> Device<'_>
Examples found in repository?
examples/simple_match.rs (line 30)
5fn main() -> Result<(), std::io::Error> {
6 let args: Vec<String> = env::args().collect();
7
8 let db_file = args
9 .get(1)
10 .map(|s| s.as_str())
11 .unwrap_or("/Users/zhaopeng/project/devcache/51Degrees-EnterpriseV3.4.trie");
12
13 let default_ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0";
14 let user_agent = args.get(2).map(|s| s.as_str()).unwrap_or(default_ua);
15
16 println!("开始加载设备数据库文件...");
17 let total_start = Instant::now();
18
19 // 创建DeviceManager实例
20 match create_device_manager(db_file) {
21 Ok(manager) => {
22 // 获取加载时间
23 if let Some(duration) = manager.get_load_time() {
24 println!("数据库加载完成,耗时: {:?}", duration);
25 }
26
27 // 首次解析(未缓存)
28 println!("\n首次解析User-Agent (未缓存)...");
29 let first_parse_start = Instant::now();
30 let device = manager.match_device(user_agent);
31 let first_parse_time = first_parse_start.elapsed();
32 println!("首次解析完成,耗时: {:?}", first_parse_time);
33
34 println!("\n基本匹配结果:");
35 print_device_info(&device);
36
37 // 再次解析相同的UA(使用缓存)
38 println!("\n再次解析相同User-Agent (使用缓存)...");
39 let second_parse_start = Instant::now();
40 let _device = manager.match_device(user_agent);
41 let second_parse_time = second_parse_start.elapsed();
42 println!("二次解析完成,耗时: {:?}", second_parse_time);
43
44 // 计算性能提升
45 if first_parse_time > second_parse_time {
46 let speedup =
47 first_parse_time.as_nanos() as f64 / second_parse_time.as_nanos() as f64;
48 println!("\n缓存性能提升: {:.2}倍", speedup);
49 }
50
51 // 打印缓存统计
52 let (hits, misses, hit_rate) = manager.get_cache_stats();
53 println!("\n缓存统计:");
54 println!(" 命中次数: {}", hits);
55 println!(" 未命中次数: {}", misses);
56 println!(" 命中率: {:.2}%", hit_rate);
57 println!(" 当前缓存大小: {}", manager.get_cache_size());
58
59 // 批量测试
60 println!("\n执行10次相同查询的批量测试...");
61 let batch_start = Instant::now();
62
63 for i in 1..=10 {
64 let start = Instant::now();
65 let _device = manager.match_device(user_agent);
66 println!(" 查询 #{}: {:?}", i, start.elapsed());
67 }
68
69 println!("10次查询总耗时: {:?}", batch_start.elapsed());
70
71 // 再次查看缓存统计
72 let (hits, misses, hit_rate) = manager.get_cache_stats();
73 println!("\n更新后的缓存统计:");
74 println!(" 命中次数: {}", hits);
75 println!(" 未命中次数: {}", misses);
76 println!(" 命中率: {:.2}%", hit_rate);
77
78 // 总计耗时
79 println!("\n总计耗时: {:?}", total_start.elapsed());
80 }
81 Err(e) => println!("创建设备管理器出错: {}", e),
82 }
83
84 Ok(())
85}
pub fn get_cached_property( &self, user_agent: &str, property_name: &str, ) -> Option<String>
Sourcepub fn get_load_time(&self) -> Option<Duration>
pub fn get_load_time(&self) -> Option<Duration>
Examples found in repository?
examples/simple_match.rs (line 23)
5fn main() -> Result<(), std::io::Error> {
6 let args: Vec<String> = env::args().collect();
7
8 let db_file = args
9 .get(1)
10 .map(|s| s.as_str())
11 .unwrap_or("/Users/zhaopeng/project/devcache/51Degrees-EnterpriseV3.4.trie");
12
13 let default_ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0";
14 let user_agent = args.get(2).map(|s| s.as_str()).unwrap_or(default_ua);
15
16 println!("开始加载设备数据库文件...");
17 let total_start = Instant::now();
18
19 // 创建DeviceManager实例
20 match create_device_manager(db_file) {
21 Ok(manager) => {
22 // 获取加载时间
23 if let Some(duration) = manager.get_load_time() {
24 println!("数据库加载完成,耗时: {:?}", duration);
25 }
26
27 // 首次解析(未缓存)
28 println!("\n首次解析User-Agent (未缓存)...");
29 let first_parse_start = Instant::now();
30 let device = manager.match_device(user_agent);
31 let first_parse_time = first_parse_start.elapsed();
32 println!("首次解析完成,耗时: {:?}", first_parse_time);
33
34 println!("\n基本匹配结果:");
35 print_device_info(&device);
36
37 // 再次解析相同的UA(使用缓存)
38 println!("\n再次解析相同User-Agent (使用缓存)...");
39 let second_parse_start = Instant::now();
40 let _device = manager.match_device(user_agent);
41 let second_parse_time = second_parse_start.elapsed();
42 println!("二次解析完成,耗时: {:?}", second_parse_time);
43
44 // 计算性能提升
45 if first_parse_time > second_parse_time {
46 let speedup =
47 first_parse_time.as_nanos() as f64 / second_parse_time.as_nanos() as f64;
48 println!("\n缓存性能提升: {:.2}倍", speedup);
49 }
50
51 // 打印缓存统计
52 let (hits, misses, hit_rate) = manager.get_cache_stats();
53 println!("\n缓存统计:");
54 println!(" 命中次数: {}", hits);
55 println!(" 未命中次数: {}", misses);
56 println!(" 命中率: {:.2}%", hit_rate);
57 println!(" 当前缓存大小: {}", manager.get_cache_size());
58
59 // 批量测试
60 println!("\n执行10次相同查询的批量测试...");
61 let batch_start = Instant::now();
62
63 for i in 1..=10 {
64 let start = Instant::now();
65 let _device = manager.match_device(user_agent);
66 println!(" 查询 #{}: {:?}", i, start.elapsed());
67 }
68
69 println!("10次查询总耗时: {:?}", batch_start.elapsed());
70
71 // 再次查看缓存统计
72 let (hits, misses, hit_rate) = manager.get_cache_stats();
73 println!("\n更新后的缓存统计:");
74 println!(" 命中次数: {}", hits);
75 println!(" 未命中次数: {}", misses);
76 println!(" 命中率: {:.2}%", hit_rate);
77
78 // 总计耗时
79 println!("\n总计耗时: {:?}", total_start.elapsed());
80 }
81 Err(e) => println!("创建设备管理器出错: {}", e),
82 }
83
84 Ok(())
85}
pub fn get_parse_time(&self) -> Option<Duration>
Sourcepub fn get_cache_stats(&self) -> (usize, usize, f64)
pub fn get_cache_stats(&self) -> (usize, usize, f64)
Examples found in repository?
examples/simple_match.rs (line 52)
5fn main() -> Result<(), std::io::Error> {
6 let args: Vec<String> = env::args().collect();
7
8 let db_file = args
9 .get(1)
10 .map(|s| s.as_str())
11 .unwrap_or("/Users/zhaopeng/project/devcache/51Degrees-EnterpriseV3.4.trie");
12
13 let default_ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0";
14 let user_agent = args.get(2).map(|s| s.as_str()).unwrap_or(default_ua);
15
16 println!("开始加载设备数据库文件...");
17 let total_start = Instant::now();
18
19 // 创建DeviceManager实例
20 match create_device_manager(db_file) {
21 Ok(manager) => {
22 // 获取加载时间
23 if let Some(duration) = manager.get_load_time() {
24 println!("数据库加载完成,耗时: {:?}", duration);
25 }
26
27 // 首次解析(未缓存)
28 println!("\n首次解析User-Agent (未缓存)...");
29 let first_parse_start = Instant::now();
30 let device = manager.match_device(user_agent);
31 let first_parse_time = first_parse_start.elapsed();
32 println!("首次解析完成,耗时: {:?}", first_parse_time);
33
34 println!("\n基本匹配结果:");
35 print_device_info(&device);
36
37 // 再次解析相同的UA(使用缓存)
38 println!("\n再次解析相同User-Agent (使用缓存)...");
39 let second_parse_start = Instant::now();
40 let _device = manager.match_device(user_agent);
41 let second_parse_time = second_parse_start.elapsed();
42 println!("二次解析完成,耗时: {:?}", second_parse_time);
43
44 // 计算性能提升
45 if first_parse_time > second_parse_time {
46 let speedup =
47 first_parse_time.as_nanos() as f64 / second_parse_time.as_nanos() as f64;
48 println!("\n缓存性能提升: {:.2}倍", speedup);
49 }
50
51 // 打印缓存统计
52 let (hits, misses, hit_rate) = manager.get_cache_stats();
53 println!("\n缓存统计:");
54 println!(" 命中次数: {}", hits);
55 println!(" 未命中次数: {}", misses);
56 println!(" 命中率: {:.2}%", hit_rate);
57 println!(" 当前缓存大小: {}", manager.get_cache_size());
58
59 // 批量测试
60 println!("\n执行10次相同查询的批量测试...");
61 let batch_start = Instant::now();
62
63 for i in 1..=10 {
64 let start = Instant::now();
65 let _device = manager.match_device(user_agent);
66 println!(" 查询 #{}: {:?}", i, start.elapsed());
67 }
68
69 println!("10次查询总耗时: {:?}", batch_start.elapsed());
70
71 // 再次查看缓存统计
72 let (hits, misses, hit_rate) = manager.get_cache_stats();
73 println!("\n更新后的缓存统计:");
74 println!(" 命中次数: {}", hits);
75 println!(" 未命中次数: {}", misses);
76 println!(" 命中率: {:.2}%", hit_rate);
77
78 // 总计耗时
79 println!("\n总计耗时: {:?}", total_start.elapsed());
80 }
81 Err(e) => println!("创建设备管理器出错: {}", e),
82 }
83
84 Ok(())
85}
pub fn clear_cache(&self)
Sourcepub fn get_cache_size(&self) -> usize
pub fn get_cache_size(&self) -> usize
Examples found in repository?
examples/simple_match.rs (line 57)
5fn main() -> Result<(), std::io::Error> {
6 let args: Vec<String> = env::args().collect();
7
8 let db_file = args
9 .get(1)
10 .map(|s| s.as_str())
11 .unwrap_or("/Users/zhaopeng/project/devcache/51Degrees-EnterpriseV3.4.trie");
12
13 let default_ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0";
14 let user_agent = args.get(2).map(|s| s.as_str()).unwrap_or(default_ua);
15
16 println!("开始加载设备数据库文件...");
17 let total_start = Instant::now();
18
19 // 创建DeviceManager实例
20 match create_device_manager(db_file) {
21 Ok(manager) => {
22 // 获取加载时间
23 if let Some(duration) = manager.get_load_time() {
24 println!("数据库加载完成,耗时: {:?}", duration);
25 }
26
27 // 首次解析(未缓存)
28 println!("\n首次解析User-Agent (未缓存)...");
29 let first_parse_start = Instant::now();
30 let device = manager.match_device(user_agent);
31 let first_parse_time = first_parse_start.elapsed();
32 println!("首次解析完成,耗时: {:?}", first_parse_time);
33
34 println!("\n基本匹配结果:");
35 print_device_info(&device);
36
37 // 再次解析相同的UA(使用缓存)
38 println!("\n再次解析相同User-Agent (使用缓存)...");
39 let second_parse_start = Instant::now();
40 let _device = manager.match_device(user_agent);
41 let second_parse_time = second_parse_start.elapsed();
42 println!("二次解析完成,耗时: {:?}", second_parse_time);
43
44 // 计算性能提升
45 if first_parse_time > second_parse_time {
46 let speedup =
47 first_parse_time.as_nanos() as f64 / second_parse_time.as_nanos() as f64;
48 println!("\n缓存性能提升: {:.2}倍", speedup);
49 }
50
51 // 打印缓存统计
52 let (hits, misses, hit_rate) = manager.get_cache_stats();
53 println!("\n缓存统计:");
54 println!(" 命中次数: {}", hits);
55 println!(" 未命中次数: {}", misses);
56 println!(" 命中率: {:.2}%", hit_rate);
57 println!(" 当前缓存大小: {}", manager.get_cache_size());
58
59 // 批量测试
60 println!("\n执行10次相同查询的批量测试...");
61 let batch_start = Instant::now();
62
63 for i in 1..=10 {
64 let start = Instant::now();
65 let _device = manager.match_device(user_agent);
66 println!(" 查询 #{}: {:?}", i, start.elapsed());
67 }
68
69 println!("10次查询总耗时: {:?}", batch_start.elapsed());
70
71 // 再次查看缓存统计
72 let (hits, misses, hit_rate) = manager.get_cache_stats();
73 println!("\n更新后的缓存统计:");
74 println!(" 命中次数: {}", hits);
75 println!(" 未命中次数: {}", misses);
76 println!(" 命中率: {:.2}%", hit_rate);
77
78 // 总计耗时
79 println!("\n总计耗时: {:?}", total_start.elapsed());
80 }
81 Err(e) => println!("创建设备管理器出错: {}", e),
82 }
83
84 Ok(())
85}
Auto Trait Implementations§
impl !Freeze for DeviceManager
impl RefUnwindSafe for DeviceManager
impl Send for DeviceManager
impl Sync for DeviceManager
impl Unpin for DeviceManager
impl UnwindSafe for DeviceManager
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more