11 releases

0.3.7 Mar 31, 2023
0.3.6 Mar 30, 2023
0.2.2 Mar 13, 2023
0.1.0 Mar 12, 2023

#454 in Asynchronous

Download history 54/week @ 2023-10-23 91/week @ 2023-10-30 78/week @ 2023-11-06 68/week @ 2023-11-13 79/week @ 2023-11-20 94/week @ 2023-11-27 41/week @ 2023-12-04 57/week @ 2023-12-11 67/week @ 2023-12-18 68/week @ 2023-12-25 90/week @ 2024-01-01 118/week @ 2024-01-08 87/week @ 2024-01-15 175/week @ 2024-01-22 410/week @ 2024-01-29 325/week @ 2024-02-05

1,005 downloads per month
Used in tokio-utils

MIT license

23KB
393 lines

Tub 🛁

github crates.io docs.rs build status codecov

A blazingly fast object pool for Rust.

Values are retrieved from the pool asynchronously. When the retrieved value goes out of scope, the value is returned to the pool.

Documentation

Read about the public API: docs.rs/tub

Read about the design: wcygan.io/post/pools

Usage

To use Tub, add this to your Cargo.toml:

[dependencies]
tub = "0.3.7"

Then create and use a pool like so:

use tub::Pool;

#[tokio::main]
async fn main() {
   // Create a pool
   let pool: Pool<Box> = (0..10)
       .map(|_| Box { value: 123 })
       .into();

   // Get a value from the pool
   let mut box1 = pool.acquire().await;

   // Use the value
   box1.foo();

   // Modify the value
   *box1 = Box { value: 456 };

   // Return the value to the pool
   drop(box1);
}

struct Box {
  value: u32
}

impl Box {
  fn foo(&mut self) { }
}

Benchmarks

In the "Pools" blog post I benchmarked Tub against other object pools in Rust.

The benchmarks help us understand how efficient the underlying mechanisms for concurrency control, object storage, and object reuse are.

The results are as follows:

Input-based comparison

The following benchmarks compare the performance of different pools under different amounts of load:

all

two

100,000 acquires & releases

The following benchmarks compare the performance of running 100,000 acquire & release operations across tasks.

Tub

tub

Async Object Pool

async-object-pool

Simple Pool

simple-pool

Dependencies

~2.1–3MB
~48K SLoC