#synchronization #wait-group #btree-map #hash-map #vec #world #able

fast-able

The world's martial arts are fast and unbreakable; 天下武功 唯快不破

83 stable releases

1.13.26 Dec 6, 2024
1.13.21 Nov 28, 2024
1.11.14 Jul 26, 2024
1.0.0 Jun 5, 2023
0.1.1 Jun 3, 2023

#134 in Concurrency

Download history 238/week @ 2024-08-30 53/week @ 2024-09-06 385/week @ 2024-09-13 69/week @ 2024-09-20 19/week @ 2024-09-27 291/week @ 2024-10-04 71/week @ 2024-10-11 165/week @ 2024-10-18 498/week @ 2024-10-25 792/week @ 2024-11-01 253/week @ 2024-11-08 1464/week @ 2024-11-15 655/week @ 2024-11-22 545/week @ 2024-11-29 255/week @ 2024-12-06

2,922 downloads per month
Used in 2 crates

MIT/Apache

145KB
3.5K SLoC

sync-data

sync-data is a high-performance synchronization library

  • SyncHashMap (sync HashMap)
  • SyncBtreeMap (sync BtreeMap)
  • SyncVec (sync Vec)
  • WaitGroup (async/blocking all support WaitGroup)

for example:

    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();
}

wait group:

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");
}

Dependencies

~2.9–8.5MB
~72K SLoC