Rust高性能计数器库fast-counter的使用,fast-counter提供快速、线程安全的计数器功能

以下是关于Rust高性能计数器库fast-counter的使用介绍:

Rust高性能计数器库fast-counter的使用,fast-counter提供快速、线程安全的计数器功能

Fast Counter是一个简单的分片并发计数器,可以在高竞争场景中使用,例如HashMap中的计数器。

这种方法在较多核心数的情况下表现出良好的扩展性,与单个原子计数器相比性能表现如下:

atomic_counter/1        time:   [1.5215 ms 1.5311 ms 1.5414 ms]
                        thrpt:  [680.28 Melem/s 684.86 Melem/s 689.19 Melem/s]

atomic_counter/2        time:   [8.1665 ms 8.3089 ms 8.4518 ms]
                        thrpt:  [124.07 Melem/s 126.20 Melem/s 128.40 Melem/s]

atomic_counter/4        time:   [10.192 ms 10.250 ms 10.303 ms]
                        thrpt:  [101.77 Melem/s 102.30 Melem/s 102.88 Melem/s]

atomic_counter/8        time:   [10.021 ms 10.131 ms 10.234 ms]
                        thrpt:  [102.46 Melem/s 103.50 Melem/s 104.64 Melem/s]

atomic_counter/16       time:   [12.362 ms 12.393 ms 12.425 ms]
                        thrpt:  [84.390 Melem/s 84.610 Melem/s 84.823 Melem/s]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

fast_counter_stable/1   time:   [1.5678 ms 1.5795 ms 1.5913 ms]
                        thrpt:  [658.92 Melem/s 663.88 Melem/s 668.81 Melem/s]

fast_counter_stable/2   time:   [820.95 us 824.81 us 828.56 us]
                        thrpt:  [1.2655 Gelem/s 1.2713 Gelem/s 1.2773 Gelem/s]

fast_counter_stable/4   time:   [429.10 us 430.62 us 432.17 us]
                        thrpt:  [2.4263 Gelem/s 2.4350 Gelem/s 2.4437 Gelem/s]

fast_counter_stable/8   time:   [240.59 us 242.92 us 245.44 us]
                        thrpt:  [4.2723 Gelem/s 4.3165 Gelem/s 4.3583 Gelem/s]

fast_counter_stable/16  time:   [206.01 us 210.24 us 214.74 us]
                        thrpt:  [4.8829 Gelem/s 4.9875 Gelem/s 5.0900 Gelem/s]

安装

在项目目录中运行以下Cargo命令:

cargo add fast-counter

或者在Cargo.toml中添加以下行:

fast-counter = "1.0.0"

完整示例代码

use fast_counter::FastCounter;
use std::sync::Arc;
use std::thread;

fn main() {
    // 创建一个快速计数器
    let counter = Arc::new(FastCounter::new(0));
    
    let mut handles = vec![];

    // 创建10个线程并发增加计数器
    for _ in 0..10 {
        let counter = Arc::clone(&counter);
        handles.push(thread::spawn(move || {
            for _ in 0..100000 {
                counter.incr();
            }
        }));
    }

    // 等待所有线程完成
    for handle in handles {
        handle.join().unwrap();
    }

    // 获取最终计数结果
    println!("Final count: {}", counter.get());
}

这个示例展示了如何在多线程环境中使用FastCounter进行并发计数操作。每个线程增加计数器100000次,10个线程总共会增加1000000次。FastCounter提供了线程安全的incr()和get()方法,确保在高并发场景下也能正确计数。

FastCounter特别适合需要高性能计数器的场景,如网络请求计数、事件统计等。


1 回复

Rust高性能计数器库fast-counter的使用

介绍

fast-counter是一个Rust语言的高性能计数器库,提供了快速且线程安全的计数器功能。它专为需要高性能计数操作的场景设计,特别适合多线程环境下的统计计数需求。

主要特点:

  • 线程安全:内部使用原子操作实现,无需额外同步
  • 高性能:比标准库的原子类型有更好的优化
  • 简单易用:提供直观的API接口
  • 低开销:最小化内存和CPU使用

安装

在Cargo.toml中添加依赖:

[dependencies]
fast-counter = "0.2"

基本使用方法

创建计数器

use fast_counter::Counter;

let counter = Counter::new(0); // 从0开始计数

基本操作

// 增加计数
counter.inc(); // 增加1
counter.inc_by(5); // 增加指定值

// 减少计数
counter.dec(); // 减少1
counter.dec_by(3); // 减少指定值

// 获取当前值
let current = counter.get();

多线程示例

use fast_counter::Counter;
use std::sync::Arc;
use std::thread;

let counter = Arc::new(Counter::new(0));
let mut handles = vec![];

for _ in 0..10 {
    let counter = Arc::clone(&counter);
    let handle = thread::spawn(move || {
        for _ in 0..1000 {
            counter.inc();
        }
    });
    handles.push(handle);
}

for handle in handles {
    handle.join().unwrap();
}

assert_eq!(counter.get(), 10000);

高级功能

重置计数器

counter.reset(); // 重置为0
counter.reset_to(42); // 重置为指定值

比较并交换(CAS)操作

// 只有当当前值为10时才设置为20
let success = counter.compare_and_swap(10, 20);

获取并增加

let prev_value = counter.get_and_inc(); // 获取当前值并增加1
let prev_value = counter.get_and_add(5); // 获取当前值并增加5

性能建议

  1. 对于单线程应用,可以考虑使用普通的整数类型
  2. 对于高并发场景,fast-counter比标准库的AtomicUsize有更好的性能
  3. 批量操作时使用inc_by/dec_by比多次调用inc/dec更高效

基准测试示例

use fast_counter::Counter;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Instant;

let fast_counter = Counter::new(0);
let atomic_counter = AtomicUsize::new(0);

let start = Instant::now();
for _ in 0..1_000_000 {
    fast_counter.inc();
}
println!("fast-counter耗时: {:?}", start.elapsed());

let start = Instant::now();
for _ in 0..1_000_000 {
    atomic_counter.fetch_add(1, Ordering::SeqCst);
}
println!("AtomicUsize耗时: {:?}", start.elapsed());

完整示例代码

use fast_counter::Counter;
use std::sync::Arc;
use std::thread;

fn main() {
    // 创建计数器
    let counter = Counter::new(0);
    
    // 基本操作演示
    counter.inc();
    println!("After inc(): {}", counter.get()); // 1
    
    counter.inc_by(5);
    println!("After inc_by(5): {}", counter.get()); // 6
    
    counter.dec();
    println!("After dec(): {}", counter.get()); // 5
    
    counter.dec_by(2);
    println!("After dec_by(2): {}", counter.get()); // 3
    
    // 重置演示
    counter.reset();
    println!("After reset: {}", counter.get()); // 0
    
    counter.reset_to(100);
    println!("After reset_to(100): {}", counter.get()); // 100
    
    // CAS操作演示
    let success = counter.compare_and_swap(100, 200);
    println!("CAS success: {}, new value: {}", success, counter.get()); // true, 200
    
    // 获取并增加演示
    let prev = counter.get_and_add(10);
    println!("get_and_add: previous={}, current={}", prev, counter.get()); // 200, 210
    
    // 多线程演示
    let shared_counter = Arc::new(Counter::new(0));
    let mut handles = vec![];
    
    for _ in 0..5 {
        let counter = Arc::clone(&shared_counter);
        handles.push(thread::spawn(move || {
            for _ in 0..10000 {
                counter.inc();
            }
        }));
    }
    
    for handle in handles {
        handle.join().unwrap();
    }
    
    println!("Final counter value: {}", shared_counter.get()); // 50000
}

这个完整示例演示了fast-counter库的所有主要功能:

  1. 基本计数操作(增加/减少)
  2. 重置计数器
  3. CAS操作
  4. 获取并增加操作
  5. 多线程环境下的使用

运行此程序将展示计数器在不同操作下的值变化,以及最终在多线程环境中正确累加的结果。

回到顶部