mf_core/runtime/
system_detector.rs1use sysinfo::System;
19
20#[derive(Debug, Clone)]
22pub struct SystemResources {
23 pub cpu_cores: usize,
25 pub cpu_threads: usize,
27 pub total_memory_mb: u64,
29 pub available_memory_mb: u64,
31}
32
33impl SystemResources {
34 pub fn detect() -> Self {
46 let mut sys = System::new_all();
47 sys.refresh_all();
48
49 Self {
50 cpu_cores: num_cpus::get_physical(),
51 cpu_threads: num_cpus::get(),
52 total_memory_mb: sys.total_memory() / 1024 / 1024,
53 available_memory_mb: sys.available_memory() / 1024 / 1024,
54 }
55 }
56
57 pub fn resource_tier(&self) -> ResourceTier {
77 match (self.cpu_cores, self.total_memory_mb) {
78 (cores, mem) if cores >= 8 && mem >= 16000 => ResourceTier::High,
80 (cores, mem) if cores >= 4 && mem >= 8000 => ResourceTier::Medium,
82 _ => ResourceTier::Low,
84 }
85 }
86
87 pub fn tier_description(&self) -> &'static str {
89 match self.resource_tier() {
90 ResourceTier::High => "高性能",
91 ResourceTier::Medium => "标准配置",
92 ResourceTier::Low => "基础配置",
93 }
94 }
95}
96
97#[derive(Debug, Clone, Copy, PartialEq, Eq)]
99pub enum ResourceTier {
100 Low,
102 Medium,
104 High,
106}
107
108impl ResourceTier {
109 pub fn as_str(&self) -> &'static str {
111 match self {
112 ResourceTier::Low => "Low",
113 ResourceTier::Medium => "Medium",
114 ResourceTier::High => "High",
115 }
116 }
117}
118
119impl std::fmt::Display for ResourceTier {
120 fn fmt(
121 &self,
122 f: &mut std::fmt::Formatter<'_>,
123 ) -> std::fmt::Result {
124 write!(f, "{}", self.as_str())
125 }
126}
127
128#[cfg(test)]
129mod tests {
130 use super::*;
131
132 #[test]
133 fn test_system_resources_detect() {
134 let resources = SystemResources::detect();
135
136 assert!(resources.cpu_cores > 0, "CPU核心数应该大于0");
138 assert!(resources.cpu_threads > 0, "CPU线程数应该大于0");
139 assert!(resources.total_memory_mb > 0, "总内存应该大于0");
140
141 assert!(
143 resources.cpu_threads >= resources.cpu_cores,
144 "CPU线程数应该大于等于核心数"
145 );
146 }
147
148 #[test]
149 fn test_resource_tier() {
150 let low_resources = SystemResources {
152 cpu_cores: 2,
153 cpu_threads: 2,
154 total_memory_mb: 4096,
155 available_memory_mb: 2048,
156 };
157 assert_eq!(low_resources.resource_tier(), ResourceTier::Low);
158
159 let medium_resources = SystemResources {
161 cpu_cores: 4,
162 cpu_threads: 8,
163 total_memory_mb: 8192,
164 available_memory_mb: 4096,
165 };
166 assert_eq!(medium_resources.resource_tier(), ResourceTier::Medium);
167
168 let high_resources = SystemResources {
170 cpu_cores: 8,
171 cpu_threads: 16,
172 total_memory_mb: 16384,
173 available_memory_mb: 8192,
174 };
175 assert_eq!(high_resources.resource_tier(), ResourceTier::High);
176 }
177
178 #[test]
179 fn test_tier_description() {
180 let resources = SystemResources::detect();
181 let description = resources.tier_description();
182 assert!(["高性能", "标准配置", "基础配置"].contains(&description));
183 }
184}