use std::time::Instant;
#[derive(Clone, Eq, PartialEq)]
pub struct ComplexData {
pub category: u16, pub priority: u16, pub padding: [u64; 4], }
struct Lcg { seed: u64 }
impl Lcg {
fn next(&mut self) -> u32 {
self.seed = self.seed.wrapping_mul(6364136223846793005).wrapping_add(1);
(self.seed >> 32) as u32
}
}
fn main() {
let n = 5_000_000;
let mut rng = Lcg { seed: 999 };
let mut data = Vec::with_capacity(n);
for _ in 0..n {
data.push(ComplexData {
category: (rng.next() % 1000) as u16,
priority: (rng.next() % 5000) as u16,
padding: [0, 0, 0, 0],
});
}
println!("Tạo {} elements ComplexData ({} bytes/struct).", n, std::mem::size_of::<ComplexData>());
let mut d1 = data.clone();
let mut d2 = data.clone();
let mut d3 = data.clone();
println!("\n▶ 1. Chạy std::sort_unstable_by (Sử dụng hàm CMP: a.cmp(b) then c.cmp(d))");
let start = Instant::now();
d1.sort_unstable_by(|a, b| {
a.category.cmp(&b.category).then(a.priority.cmp(&b.priority))
});
println!("⏱ Thời gian: {:?}", start.elapsed());
println!("\n▶ 2. Chạy std::sort_unstable_by_key (Trả về Tuple: (category, priority))");
let start = Instant::now();
d2.sort_unstable_by_key(|item| (item.category, item.priority));
println!("⏱ Thời gian: {:?}", start.elapsed());
println!("\n▶ 3. Chạy std::sort_unstable_by_key (Packed Integer Key 32-bit)");
let start = Instant::now();
d3.sort_unstable_by_key(|item| {
((item.category as u32) << 16) | (item.priority as u32)
});
println!("⏱ Thời gian: {:?}", start.elapsed());
assert_eq!(d1[0].category, d2[0].category);
assert_eq!(d2[0].category, d3[0].category);
}