Rust高性能IO计数器库countio的使用,countio提供轻量级、高效的字节流读写统计功能

Rust高性能IO计数器库countio的使用

countio是一个轻量级、高效的字节流读写统计库,它提供了对std::io::{Read, Write, Seek}及其异步版本(futurestokio)的字节计数功能。

特性

  • std:启用std::io::{Read, Write, Seek}功能(默认启用)
  • futures:启用futures_io::{AsyncRead, AsyncWrite, AsyncSeek}功能
  • tokio:启用tokio::io::{AsyncRead, AsyncWrite, AsyncSeek}功能

使用示例

示例1:std::io::Read计数

use std::io::{BufRead, BufReader, Result};
use countio::Counter;

fn main() -> Result<()> {
    let reader = "Hello World!".as_bytes();
    let reader = BufReader::new(reader);
    let mut reader = Counter::new(reader);

    let mut buf = String::new();
    let len = reader.read_line(&mut buf)?;

    assert_eq!(len, reader.reader_bytes());
    Ok(())
}

示例2:std::io::Write计数

use std::io::{BufWriter, Write, Result};
use countio::Counter;

fn main() -> Result<()> {
    let writer = Vec::new();
    let writer = BufWriter::new(writer);
    let mut writer = Counter::new(writer);

    let buf = "Hello World!".as_bytes();
    let len = writer.write(buf)?;
    writer.flush()?;

    assert_eq!(len, writer.writer_bytes());
    Ok(())
}

完整示例代码

use std::io::{BufRead, BufReader, BufWriter, Write, Result};
use countio::Counter;

// 读取计数器示例
fn read_counter_example() -> Result<()> {
    // 创建一个带缓冲的读取器
    let reader = "Hello World!\nThis is a test.\n".as_bytes();
    let reader = BufReader::new(reader);
    let mut reader = Counter::new(reader);

    // 读取第一行
    let mut buf = String::new();
    let len = reader.read_line(&mut buf)?;
    println!("Read {} bytes: {}", len, buf.trim());
    println!("Total bytes read: {}", reader.reader_bytes());

    // 读取第二行
    buf.clear();
    let len = reader.read_line(&mut buf)?;
    println!("Read {} bytes: {}", len, buf.trim());
    println!("Total bytes read: {}", reader.reader_bytes());

    Ok(())
}

// 写入计数器示例
fn write_counter_example() -> Result<()> {
    // 创建一个带缓冲的写入器
    let writer = Vec::new();
    let writer = BufWriter::new(writer);
    let mut writer = Counter::new(writer);

    // 写入数据
    let data1 = "Hello ".as_bytes();
    let len1 = writer.write(data1)?;
    println!("Wrote {} bytes", len1);
    println!("Total bytes written: {}", writer.writer_bytes());

    let data2 = "World!".as_bytes();
    let len2 = writer.write(data2)?;
    println!("Wrote {} bytes", len2);
    println!("Total bytes written: {}", writer.writer_bytes());

    // 确保所有数据都写入
    writer.flush()?;

    Ok(())
}

fn main() {
    println!("=== Read Counter Example ===");
    if let Err(e) = read_counter_example() {
        eprintln!("Error: {}", e);
    }

    println!("\n=== Write Counter Example ===");
    if let Err(e) = write_counter_example() {
        eprintln!("Error: {}", e);
    }
}

安装

在Cargo.toml中添加依赖:

countio = "0.2.19"

或者运行命令:

cargo add countio

1 回复

Rust高性能IO计数器库countio使用指南

countio是一个轻量级、高效的Rust库,专门用于统计字节流的读写操作。它通过包装标准I/O类型来透明地记录传输的字节数,非常适合需要监控I/O使用情况的场景。

主要特性

  • 轻量级包装器设计,几乎零开销
  • 支持所有标准I/O类型(Read/Write/BufRead等)
  • 线程安全,内部使用原子计数器
  • 可随时查询当前统计值而不中断I/O操作

基本使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
countio = "0.3"

基本示例

use countio::CountIo;
use std::io::{Read, Write};

fn main() -> std::io::Result<()> {
    // 包装一个Vec<u8>作为写入目标
    let mut buf = vec![];
    let mut writer = CountIo::new(&mut buf);
    
    // 写入数据
    writer.write_all(b"Hello, world!")?;
    
    // 获取写入字节数
    println!("Bytes written: {}", writer.count());
    
    // 包装一个读取器
    let data = b"Some data to read";
    let mut reader = CountIo::new(&data[..]);
    
    let mut dest = [0; 5];
    reader.read_exact(&mut dest)?;
    
    // 获取读取字节数
    println!("Bytes read: {}", reader.count());
    
    Ok(())
}

高级用法

组合使用

use countio::CountIo;
use std::io::{BufRead, BufReader, Cursor};

fn main() {
    let data = "Line 1\nLine 2\nLine 3".as_bytes();
    let reader = BufReader::new(Cursor::new(data));
    let mut counting_reader = CountIo::new(reader);
    
    let mut lines = 0;
    let mut buffer = String::new();
    
    while counting_reader.read_line(&mut buffer).unwrap() > 0 {
        lines += 1;
        buffer.clear();
    }
    
    println!("Read {} lines ({} bytes)", lines, counting_reader.count());
}

重置计数器

use countio::CountIo;
use std::io::Write;

fn main() {
    let mut output = vec![];
    let mut writer = CountIo::new(&mut output);
    
    writer.write_all(b"First write").unwrap();
    println!("Count after first write: {}", writer.count());
    
    writer.reset_count();
    
    writer.write_all(b"Second write").unwrap();
    println!("Count after second write: {}", writer.count());
}

多线程使用

use countio::CountIo;
use std::io::Write;
use std::sync::Arc;
use std::thread;

fn main() {
    let output = Arc::new(std::sync::Mutex::new(vec![]));
    let writer = CountIo::new(Arc::clone(&output));
    
    let handles: Vec<_> = (0..4).map(|i| {
        let mut writer = writer.try_clone().unwrap();
        thread::spawn(move || {
            writer.write_all(format!("Thread {} data\n", i).as_bytes()).unwrap();
        })
    }).collect();
    
    for handle in handles {
        handle.join().unwrap();
    }
    
    println!("Total bytes written: {}", writer.count());
    println!("Output: {:?}", String::from_utf8_lossy(&output.lock().unwrap()));
}

完整示例demo

下面是一个完整的文件读写统计示例,展示了如何使用countio监控文件操作:

use countio::CountIo;
use std::fs::File;
use std::io::{self, BufReader, BufWriter, Read, Write};

fn main() -> io::Result<()> {
    // 1. 写入文件并统计字节数
    let file = File::create("example.txt")?;
    let mut writer = CountIo::new(BufWriter::new(file));
    
    // 写入多行数据
    for i in 1..=5 {
        writeln!(writer, "这是第{}行文本数据", i)?;
    }
    
    // 强制刷新缓冲区确保数据写入
    writer.flush()?;
    
    println!("写入文件完成,总字节数: {}", writer.count());
    
    // 2. 读取同一文件并统计字节数
    let file = File::open("example.txt")?;
    let mut reader = CountIo::new(BufReader::new(file));
    
    let mut content = String::new();
    reader.read_to_string(&mut content)?;
    
    println!("\n文件内容:\n{}", content);
    println!("读取文件完成,总字节数: {}", reader.count());
    
    // 3. 多线程写入示例
    println!("\n多线程写入示例:");
    let shared_writer = CountIo::new(io::stdout());
    
    let handles: Vec<_> = (0..3).map(|i| {
        let mut writer = shared_writer.try_clone().unwrap();
        std::thread::spawn(move || {
            writeln!(writer, "线程{}写入的数据", i).unwrap();
        })
    }).collect();
    
    for handle in handles {
        handle.join().unwrap();
    }
    
    println!("多线程总写入字节数: {}", shared_writer.count());
    
    Ok(())
}

性能考虑

countio设计时考虑了最小化性能影响:

  • 使用原子操作保证线程安全
  • 计数器只在I/O操作时更新
  • 无额外内存分配

对于极端性能敏感的场景,建议进行基准测试,但大多数情况下开销可以忽略不计。

适用场景

  • 网络传输监控
  • 文件处理进度跟踪
  • 数据流分析
  • 调试I/O密集型操作
  • 资源使用统计

countio通过简单透明的包装为Rust程序提供了便捷的I/O统计功能,是监控和分析I/O行为的理想工具。

回到顶部