面试题答案
一键面试1. 浅拷贝与深拷贝概念
- 浅拷贝:只复制对象的引用,多个变量共享相同的数据,修改其中一个变量可能影响其他变量。
- 深拷贝:复制对象及其所有嵌套数据,新对象与原对象相互独立,修改不会相互影响。
2. 使用benchmark
测试框架评估性能
2.1 引入依赖
在Cargo.toml
中添加bencher
依赖:
[dev-dependencies]
bencher = "0.5"
2.2 编写测试代码
use std::time::Instant;
// 定义数据结构
struct MyData {
value: Vec<i32>,
}
// 浅拷贝实现
fn shallow_copy(data: &MyData) -> &MyData {
data
}
// 深拷贝实现
fn deep_copy(data: &MyData) -> MyData {
MyData {
value: data.value.clone(),
}
}
#[cfg(test)]
mod tests {
use super::*;
use bencher::Bencher;
#[bench]
fn bench_shallow_copy(b: &mut Bencher) {
let data = MyData { value: (0..1000).collect() };
b.iter(|| {
shallow_copy(&data);
});
}
#[bench]
fn bench_deep_copy(b: &mut Bencher) {
let data = MyData { value: (0..1000).collect() };
b.iter(|| {
deep_copy(&data);
});
}
}
2.3 运行测试
在项目根目录执行cargo bench
,bencher
会运行所有标记为bench
的函数,并输出每个函数的运行时间等性能数据。
3. 根据测试结果选择拷贝方式
- 如果数据量小:深拷贝可能由于简单直接,性能影响不大。
- 如果数据量大:浅拷贝因为只复制引用,性能会明显优于深拷贝。但要注意共享数据带来的风险。
4. 高并发场景下的性能表现及测试要点
4.1 性能表现
- 浅拷贝:由于只复制引用,在高并发场景下可能因多线程访问共享数据带来竞争风险,需额外同步机制(如
Mutex
等),同步开销可能抵消浅拷贝优势。 - 深拷贝:每个线程有独立数据副本,不存在竞争问题,但大量数据深拷贝开销大,可能导致性能瓶颈。
4.2 测试要点
- 多线程测试:使用
std::thread
创建多个线程,并行执行拷贝操作。
use std::thread;
fn concurrent_shallow_copy() {
let data = MyData { value: (0..1000).collect() };
let mut handles = vec![];
for _ in 0..10 {
let data_ref = &data;
let handle = thread::spawn(move || {
shallow_copy(data_ref);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
fn concurrent_deep_copy() {
let data = MyData { value: (0..1000).collect() };
let mut handles = vec![];
for _ in 0..10 {
let data_ref = &data;
let handle = thread::spawn(move || {
deep_copy(data_ref);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
- 同步机制测试:在浅拷贝多线程场景下,添加同步机制(如
Mutex
),测试其对性能影响。
use std::sync::{Mutex, Arc};
fn concurrent_shallow_copy_with_sync() {
let data = Arc::new(Mutex::new(MyData { value: (0..1000).collect() }));
let mut handles = vec![];
for _ in 0..10 {
let data_clone = data.clone();
let handle = thread::spawn(move || {
let data = data_clone.lock().unwrap();
shallow_copy(&data);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
- 性能指标:关注平均拷贝时间、最大最小拷贝时间、线程竞争情况(如使用
parking_lot
库统计锁争用情况)等指标,综合评估不同拷贝策略在高并发场景下的性能。