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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
| // WASM性能优化最佳实践
mod performance_optimization {
// 1. 减少JS-WASM边界调用
pub struct BatchProcessor {
data: Vec<f32>,
}
impl BatchProcessor {
// 不好的做法:频繁调用WASM
pub fn process_one_by_one(&self, items: &[f32]) -> Vec<f32> {
items.iter()
.map(|item| self.compute(item)) // 每次都跨边界
.collect()
}
// 好的做法:批量处理
pub fn process_batch(&self, items: &[f32]) -> Vec<f32> {
// 一次调用,处理所有数据
items.iter()
.map(|item| self.compute(item))
.collect()
}
fn compute(&self, value: f32) -> f32 {
value * 2.0
}
}
// 2. 使用SIMD指令
#[cfg(target_arch = "wasm32")]
use std::arch::wasm32::*;
#[target_feature(enable = "simd128")]
pub unsafe fn vector_add(a: &[f32], b: &[f32]) -> Vec<f32> {
assert!(a.len() == b.len());
let mut result = vec![0.0; a.len()];
for i in (0..a.len()).step_by(4) {
let va = v128_load(a.as_ptr().add(i));
let vb = v128_load(b.as_ptr().add(i));
let vr = f32x4_add(va, vb);
v128_store(result.as_mut_ptr().add(i), vr);
}
result
}
// 3. 内存预分配
pub struct MemoryPool {
buffers: Vec<Vec<u8>>,
buffer_size: usize,
}
impl MemoryPool {
pub fn new(buffer_size: usize, pool_size: usize) -> Self {
Self {
buffers: (0..pool_size)
.map(|_| vec![0; buffer_size])
.collect(),
buffer_size,
}
}
pub fn acquire(&mut self) -> Vec<u8> {
self.buffers.pop()
.unwrap_or_else(|| vec![0; self.buffer_size])
}
pub fn release(&mut self, buffer: Vec<u8>) {
self.buffers.push(buffer);
}
}
// 4. 延迟计算
pub struct LazyEvaluator<T> {
evaluated: bool,
value: Option<T>,
compute_fn: Box<dyn Fn() -> T>,
}
impl<T> LazyEvaluator<T> {
pub fn new(compute_fn: Box<dyn Fn() -> T>) -> Self {
Self {
evaluated: false,
value: None,
compute_fn,
}
}
pub fn get(&mut self) -> &T {
if !self.evaluated {
self.value = Some((self.compute_fn)());
self.evaluated = true;
}
self.value.as_ref().unwrap()
}
}
}
|