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
性能建议
- 对于单线程应用,可以考虑使用普通的整数类型
- 对于高并发场景,fast-counter比标准库的
AtomicUsize
有更好的性能 - 批量操作时使用
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库的所有主要功能:
- 基本计数操作(增加/减少)
- 重置计数器
- CAS操作
- 获取并增加操作
- 多线程环境下的使用
运行此程序将展示计数器在不同操作下的值变化,以及最终在多线程环境中正确累加的结果。