#同步 #btree-map #wait-group #hash-map #vec #able #sync-hash-map

fast-able

世界武术以快无破;天下武功,唯快不破

46个稳定版本

1.11.14 2024年7月26日
1.11.13 2024年7月25日
1.7.11 2024年6月29日
1.6.0 2024年5月16日
0.1.1 2023年6月3日

#140并发 中排名

Download history 506/week @ 2024-05-03 196/week @ 2024-05-10 86/week @ 2024-05-17 6/week @ 2024-05-24 1/week @ 2024-05-31 3/week @ 2024-06-07 659/week @ 2024-06-14 514/week @ 2024-06-21 1498/week @ 2024-06-28 736/week @ 2024-07-05 875/week @ 2024-07-12 458/week @ 2024-07-19 389/week @ 2024-07-26 29/week @ 2024-08-02

每月1,068次下载
用于 lpc

MIT/Apache

115KB
3K SLoC

sync-data

sync-data 是一个高性能同步库

  • SyncHashMap (sync HashMap)
  • SyncBtreeMap (sync BtreeMap)
  • SyncVec (sync Vec)
  • WaitGroup (支持异步/阻塞的WaitGroup)

例如

    pub static RECKON_BY_SEC: once_cell::sync::Lazy<Statis> =
    once_cell::sync::Lazy::new(|| Statis::new(|v| println!("one sec run sum: {v}")));

// one sec run sum: 2347872
#[test]
fn bench_insert_mul_thread() {
    // common_uu::log4rs_mod::init().unwrap();
    let rw = Arc::new(SyncHashMap::new(Some(10)));
    rw.insert(1, 1);
    assert_eq!(rw.len(), 1);

    let rw2 = rw.clone();
    let rt1 = std::thread::spawn(move || {
        for i in 0..5_0000_0000_u64 {
            rw2.insert(i, i + 1);
            RECKON_BY_SEC.add();
        }
    });

    let rw2 = rw.clone();
    let rt2 = std::thread::spawn(move || {
        for i in 5_0000_0000..10_0000_0000_u64 {
            rw2.insert(i, i + 1);
            RECKON_BY_SEC.add();
        }
    });

    let rw2 = rw.clone();
    let rt3 = std::thread::spawn(move || {
        for i in 10_0000_0000_u64..50_0000_0000_u64 {
            rw2.insert(i, i + 1);
            RECKON_BY_SEC.add();
        }
    });


    rt1.join();
}

等待组

use std::time::Duration;
use tokio::time::sleep;
use fast_able::wg::WaitGroup;
#[tokio::test]
async fn test_wg() {
    let wg = WaitGroup::new();
    let wg2 = wg.clone();
    tokio::spawn(async move {
        sleep(Duration::from_secs(1)).await;
        drop(wg2);
    });
    let wg2 = wg.clone();
    tokio::spawn(async move {
        sleep(Duration::from_secs(1)).await;
        drop(wg2);
    });
    wg.wait_async().await;
    println!("all done");
}

依赖

~1.6–7MB
~47K SLoC