Rust实用工具库winter-utils的使用,提供高效基础功能扩展与辅助开发工具

Rust实用工具库winter-utils的使用,提供高效基础功能扩展与辅助开发工具

Winter utils是一个由Winterfell STARK证明器和验证器使用的实用工具库。该库提供了以下主要功能类别:

  1. 用于序列化和反序列化的Trait
  2. 用于向量和切片转换的函数
  3. 用于在常规迭代器和并行迭代器之间轻松切换的宏
  4. 基于特性的集合和字符串重新导出

特性配置

该库可以编译为以下特性:

  • std - 默认启用,依赖Rust标准库
  • concurrent - 需要std,并重新导出rayon库,启用部分函数的多线程执行
  • no_std - 不依赖Rust标准库,可编译为WebAssembly

要使用no_std编译,需要通过--no-default-features标志禁用默认特性。

并发执行

当启用concurrent特性时,该库会重新导出rayon库并使用多线程执行以下函数:

  • transpose_slice()

线程数量可以通过RAYON_NUM_THREADS环境变量配置,通常默认为机器上的逻辑核心数。

许可证

该项目采用MIT许可证。

示例代码

use winter_utils::{ByteReader, ByteWriter, Deserializable, Serializable};

// 定义一个简单的结构体并实现序列化/反序列化
#[derive(Debug, PartialEq)]
struct Point {
    x: u32,
    y: u32,
}

impl Serializable for Point {
    fn write_into<W: ByteWriter>(&self, target: &mut W) {
        target.write_u32(self.x);
        target.write_u32(self.y);
    }
}

impl Deserializable for Point {
    fn read_from<R: ByteReader>(source: &mut R) -> Self {
        let x = source.read_u32();
        let y = source.read_u32();
        Point { x, y }
    }
}

fn main() {
    // 序列化示例
    let point = Point { x: 10, y: 20 };
    let mut bytes = Vec::new();
    point.write_into(&mut bytes);
    println!("Serialized bytes: {:?}", bytes);
    
    // 反序列化示例
    let mut reader = &bytes[..];
    let deserialized = Point::read_from(&mut reader);
    println!("Deserialized point: {:?}", deserialized);
    assert_eq!(point, deserialized);
}

另一个示例展示如何使用并行迭代:

use winter_utils::{iterators::*, UncheckedSlice};

// 启用并发特性时的并行处理示例
#[cfg(feature = "concurrent")]
fn parallel_example() {
    let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    
    // 使用并行迭代器
    let sum: i32 = data.par_iter().map(|&x| x * x).sum();
    println!("Sum of squares (parallel): {}", sum);
    
    // 安全转换示例
    let slice: &[i32] = &data;
    let unchecked = unsafe { slice.to_unchecked() };
    println!("Unchecked slice length: {}", unchecked.len());
}

fn main() {
    #[cfg(feature = "concurrent")]
    parallel_example();
}

要使用这个库,可以在你的项目中添加以下依赖:

[dependencies]
winter-utils = "0.13.1"

或者运行以下命令:

cargo add winter-utils

完整示例代码

下面是一个结合了序列化和并行处理的完整示例:

use winter_utils::{
    ByteReader, ByteWriter, Deserializable, Serializable, 
    iterators::*, UncheckedSlice
};

// 定义一个包含数组的结构体
#[derive(Debug, PartialEq)]
struct DataBlock {
    id: u64,
    values: Vec<i32>,
}

impl Serializable for DataBlock {
    fn write_into<W: ByteWriter>(&self, target: &mut W) {
        target.write_u64(self.id);
        target.write_usize(self.values.len());
        for &value in &self.values {
            target.write_i32(value);
        }
    }
}

impl Deserializable for DataBlock {
    fn read_from<R: ByteReader>(source: &mut R) -> Self {
        let id = source.read_u64();
        let len = source.read_usize();
        let mut values = Vec::with_capacity(len);
        for _ in 0..len {
            values.push(source.read_i32());
        }
        DataBlock { id, values }
    }
}

// 主函数
fn main() {
    // 创建示例数据
    let data = DataBlock {
        id: 12345,
        values: (1..=100).collect(),
    };

    // 序列化
    let mut bytes = Vec::new();
    data.write_into(&mut bytes);
    println!("Serialized data length: {} bytes", bytes.len());

    // 反序列化
    let mut reader = &bytes[..];
    let decoded = DataBlock::read_from(&mut reader);
    assert_eq!(data, decoded);

    // 并行处理示例 (需要启用concurrent特性)
    #[cfg(feature = "concurrent")]
    {
        println!("\nParallel processing:");
        
        // 使用并行迭代器计算平均值
        let sum: i64 = data.values.par_iter().map(|&x| x as i64).sum();
        let avg = sum as f64 / data.values.len() as f64;
        println!("Average (parallel): {:.2}", avg);

        // 使用不安全转换
        let slice: &[i32] = &data.values;
        let unchecked = unsafe { slice.to_unchecked() };
        println!("First value via unchecked: {}", unchecked[0]);
    }
}

这个完整示例展示了:

  1. 复杂结构体的序列化/反序列化实现
  2. 包含动态长度数组的处理
  3. 并行计算特性(需要启用concurrent特性)
  4. 不安全切片转换的使用

要运行这个示例,请在Cargo.toml中添加依赖:

[dependencies]
winter-utils = { version = "0.13.1", features = ["concurrent"] }

然后使用cargo run执行程序。


1 回复

Rust实用工具库winter-utils使用指南

winter-utils是一个Rust实用工具库,旨在提供高效的基础功能扩展和辅助开发工具,帮助开发者提高开发效率。

主要功能

  1. 高效数据结构
  2. 常用算法实现
  3. 开发辅助工具
  4. 性能优化工具
  5. 并发编程辅助

安装方法

在Cargo.toml中添加依赖:

[dependencies]
winter-utils = "0.4"

核心功能及使用示例

1. 集合扩展

use winter_utils::collections;

fn main() {
    let mut vec = vec![1, 2, 3, 4, 5];
    
    // 安全地交换删除
    let removed = collections::swap_remove_if(&mut vec, |&x| x == 3);
    println!("Removed: {:?}, Remaining: {:?}", removed, vec);
    
    // 集合操作
    let a = [1, 2, 3];
    let b = [3, 4, 5];
    let intersection = collections::array_intersection(&a, &b);
    println!("Intersection: {:?}", intersection);
}

2. 位操作工具

use winter_utils::bits;

fn main() {
    let value: u32 = 0b1010_1010;
    
    // 统计设置位数
    println!("Bits set: {}", bits::count_ones(value));
    
    // 反转位顺序
    println!("Reversed: {:b}", bits::reverse_bits(value));
    
    // 检查是否为2的幂
    println!("Is power of two: {}", bits::is_power_of_two(16));
}

3. 高性能哈希

use winter_utils::hash::{fast_hash, FastHasher};

fn main() {
    // 快速哈希计算
    let data = "hello world".as_bytes();
    let hash = fast_hash(data);
    println!("Fast hash: {}", hash);
    
    // 使用Hasher
    let mut hasher = FastHasher::new();
    hasher.write(data);
    let hash2 = hasher.finish();
    println!("Hasher result: {}", hash2);
}

4. 并行处理工具

use winter_utils::parallel;

fn main() {
    let data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    
    // 并行处理
    let results = parallel::par_map(data, |x| x * 2);
    println!("Parallel mapped: {:?}", results);
    
    // 并行过滤
    let filtered = parallel::par_filter(data, |&x| x % 2 == 0);
    println!("Parallel filtered: {:?}", filtered);
}

5. 开发辅助工具

use winter_utils::dev;

fn main() {
    // 测量代码执行时间
    dev::time_it!("Fibonacci calculation", {
        let fib_30 = fibonacci(30);
        println!("Fib(30) = {}", fib_30);
    });
    
    // 内存使用统计
    let usage = dev::memory_usage();
    println!("Current memory usage: {} KB", usage);
}

fn fibonacci(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fibonacci(n-1) + fibonacci(n-2),
    }
}

完整示例代码

下面是一个综合使用winter-utils多个功能的完整示例:

use winter_utils::{collections, bits, hash::{fast_hash, FastHasher}, parallel, dev};

fn main() {
    // 1. 集合扩展示例
    let mut numbers = vec![10, 20, 30, 40, 50];
    let removed = collections::swap_remove_if(&mut numbers, |&x| x == 30);
    println!("Removed element: {:?}, Remaining: {:?}", removed, numbers);
    
    // 2. 位操作示例
    let bits_value: u64 = 0b1100_1100;
    println!("Bit count: {}", bits::count_ones(bits_value));
    println!("Is power of two: {}", bits::is_power_of_two(1024));
    
    // 3. 哈希示例
    let data = "sample data".as_bytes();
    println!("Fast hash: {}", fast_hash(data));
    
    let mut hasher = FastHasher::new();
    hasher.write(data);
    println!("Hasher output: {}", hasher.finish());
    
    // 4. 并行处理示例
    let inputs = (0..100).collect::<Vec<_>>();
    let squared = parallel::par_map(inputs.clone(), |x| x * x);
    println!("First 5 squared: {:?}", &squared[..5]);
    
    // 5. 开发工具示例
    dev::time_it!("Parallel processing", {
        let _ = parallel::par_filter(inputs, |&x| x % 3 == 0);
    });
    
    println!("Current memory: {} KB", dev::memory_usage());
}

性能提示

  1. 对于小型集合,顺序操作可能比并行操作更快
  2. 使用fast_hash代替标准哈希函数可获得更好性能
  3. 位操作工具针对常见CPU指令集进行了优化

注意事项

  1. 某些功能需要特定的CPU特性支持
  2. 并行工具使用Rayon作为后端,确保已正确配置线程池
  3. 生产环境使用前应进行充分测试

winter-utils库持续更新中,建议定期检查新版本以获取性能改进和新功能。

回到顶部