Skip to content

Commit 5abff98

Browse files
committed
feat: 完成尾部数据的优化操作
1 parent caa21c0 commit 5abff98

File tree

4 files changed

+73
-30
lines changed

4 files changed

+73
-30
lines changed

src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ fn main_test() {
3535
// polyfill: vec![],
3636
// comment_base: Some(true),
3737
// comment_name_table: Some(true),
38-
// comment_unicodes: Some(true),
38+
comment_unicodes: Some(true),
3939
// compress: Some(true),
4040
// file_name: Some("input.css".to_string()),
4141
..Default::default()
4242
}),
43-
chunk_size: Some(20 * 1024),
43+
// chunk_size: Some(40 * 1024),
4444
// 精确控制
4545
// subsets: vec![[65]].iter().map(|x| u32_array_to_u8_array(x)).collect(),
4646
// language_areas: Some(false),

src/pre_subset/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ pub fn pre_subset(ctx: &mut Context) {
7676
if ctx.input.font_feature.unwrap_or(true) {
7777
process.push(features_plugin);
7878
}
79-
if ctx.input.reduce_mins.unwrap_or(true) {
79+
if ctx.input.reduce_mins.unwrap_or(false) {
8080
process.push(reduce_min_plugin);
8181
}
8282
for p in process {

src/pre_subset/plugin_auto_subset.rs

+70-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use indexmap::IndexSet;
22

3-
use log::info;
3+
use log::{debug, info};
44

55
use crate::run_subset::build_single_subset;
66

@@ -36,31 +36,74 @@ pub fn chunk_iterable_and_flat(
3636
subsets: &mut Vec<IndexSet<u32>>,
3737
max_chunk_size: u32,
3838
) -> Vec<IndexSet<u32>> {
39-
let max_chunk_size = max_chunk_size - 1;
4039
subsets
4140
.iter()
42-
.flat_map(|subset| {
43-
let mut count = 0;
44-
let mut result: Vec<IndexSet<u32>> = vec![];
45-
let mut new_subset: IndexSet<u32> = IndexSet::new();
46-
subset.iter().for_each(|c| {
47-
new_subset.insert(c.clone());
48-
if count >= max_chunk_size {
49-
count = 0;
50-
result.push(new_subset.clone());
51-
new_subset = IndexSet::new();
52-
} else {
53-
count += 1;
54-
}
55-
});
56-
if new_subset.len() > 0 {
57-
result.push(new_subset)
58-
};
59-
result
60-
})
41+
.flat_map(|subset| split_vector(subset, max_chunk_size))
6142
.collect::<Vec<IndexSet<u32>>>()
6243
}
6344

45+
// 计算当前包需要容纳多少个字符 y= max_count/ x^(1/3)
46+
fn length_for_index(x: usize, max_count: u32) -> usize {
47+
let y: f32 = (max_count as f32) / (x as f32).cbrt(); // 计算立方根并求解y
48+
let y_ceil = y.ceil(); // 将结果向上取整
49+
y_ceil as usize
50+
}
51+
fn split_vector(vec: &IndexSet<u32>, max_count: u32) -> Vec<IndexSet<u32>> {
52+
let mut result: Vec<IndexSet<u32>> = Vec::new();
53+
let mut current_start = 0;
54+
let size = vec.len();
55+
56+
for i in 1.. {
57+
if current_start >= size {
58+
debug!("fold {} -> {} | max {}", size, i - 1, max_count);
59+
break;
60+
}
61+
let len = length_for_index(i, max_count);
62+
// println!("{}", len);
63+
let to_take = std::cmp::min(len, size - current_start);
64+
let new_sub_vec = IndexSet::from_iter(
65+
vec[current_start..current_start + to_take].iter().cloned(),
66+
);
67+
result.push(new_sub_vec);
68+
current_start += to_take;
69+
}
70+
71+
result
72+
}
73+
#[cfg(test)]
74+
mod tests {
75+
use super::*;
76+
77+
#[test]
78+
fn split_vector_empty_input_empty_result() {
79+
let input = IndexSet::new();
80+
let result = split_vector(&input, 150);
81+
assert!(result.is_empty());
82+
}
83+
84+
#[test]
85+
fn split_vector_single_element_single_element_result() {
86+
let mut input = IndexSet::new();
87+
for x in 1..10 {
88+
input.insert(x);
89+
}
90+
let result = split_vector(&input, 150);
91+
assert_eq!(result.len(), 1);
92+
assert_eq!(result[0], input);
93+
// println!("result: {:?}", result)
94+
}
95+
96+
#[test]
97+
fn split_vector_multiple_elements_multiple_subsets() {
98+
let mut input = IndexSet::new();
99+
for x in 1..400 {
100+
input.insert(x);
101+
}
102+
let result = split_vector(&input, 150);
103+
println!("result: {:#?}", result);
104+
assert_eq!(result.len(), 4);
105+
}
106+
}
64107
#[test]
65108
fn for_chunk_iterable_and_flat() {
66109
let mut subsets = vec![
@@ -71,11 +114,12 @@ fn for_chunk_iterable_and_flat() {
71114
assert_eq!(
72115
result,
73116
vec![
74-
IndexSet::from([1, 2, 3, 4, 5]),
75-
IndexSet::from([6, 7, 8, 9, 10]),
76-
IndexSet::from([11, 12, 13, 14, 15]),
77-
IndexSet::from([16, 17, 18, 19, 20]),
78-
IndexSet::from([21]),
117+
IndexSet::from([1, 2, 3, 4]),
118+
IndexSet::from([5, 6, 7, 8]),
119+
IndexSet::from([9, 10]),
120+
IndexSet::from([11, 12, 13, 14]),
121+
IndexSet::from([15, 16, 17, 18]),
122+
IndexSet::from([19, 20, 21]),
79123
]
80124
);
81125
}

src/run_subset.rs

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use log::{debug, warn};
1313
use rayon::iter::{
1414
IndexedParallelIterator, IntoParallelRefIterator, ParallelIterator,
1515
};
16-
use std::collections::btree_set::Difference;
1716
use std::time::Instant;
1817
use woff::version2::compress;
1918

0 commit comments

Comments
 (0)