Pool issues owned values wrapped in smartpointers.
extern crate lifeguard;
use lifeguard::{Pool, Recycled};
fn main() {
let mut pool : Pool<String> = Pool::with_size(10);
{
let string = pool.new_from("Hello, World!"); // Pool size is now 9
} // Values that have gone out of scope are automatically moved back into the pool.
// Pool size is 10 again
}Values taken from the pool can be dereferenced to access/mutate their contents.
extern crate lifeguard;
use lifeguard::Pool;
fn main() {
let mut pool : Pool<String> = Pool::with_size(10);
let mut string = pool.new_from("cat");
string.push_str("s love eating mice"); //string.as_mut() also works
assert_eq!("cats love eating mice", *string);
}Values can be unwrapped, detaching them from the pool.
extern crate lifeguard;
use lifeguard::Pool;
fn main() {
let mut pool : Pool<String> = Pool::with_size(10);
{
let string : String = pool.new().detach();
} // The String goes out of scope and is dropped; it is not returned to the pool
assert_eq!(9, pool.size());
}Values can be manually entered into / returned to the pool.
extern crate lifeguard;
use lifeguard::{Pool, Recycled};
fn main() {
let mut pool : Pool<String> = Pool::with_size(10);
{
let string : String = pool.detached(); // An unwrapped String, detached from the Pool
assert_eq!(9, pool.size());
let rstring : Recycled<String> = pool.attach(string); // The String is attached to the pool again
assert_eq!(9, pool.size()); // but it is still checked out from the pool
} // rstring goes out of scope and is added back to the pool
assert_eq!(10, pool.size());
}Benchmark source can be found here. Tests were run on a VirtualBox VM with 3 CPUs @ 3Ghz and 4GB of RAM.
String::with_capacity |
Pool::new_rc |
Improvement | Pool::new |
Improvement |
|---|---|---|---|---|
| 1421183 ns/iter (+/- 161572) | 841286 ns/iter (+/- 78602) | ~40.80% | 615875 ns/iter (+/- 53906) | ~56.67% |
String::to_owned |
Pool::new_rc_from |
Improvement | Pool::new_from |
Improvement |
|---|---|---|---|---|
| 2256492 ns/iter (+/- 184229) | 1652247 ns/iter (+/- 185096) | ~26.78% | 1430212 ns/iter (+/- 146108) | ~36.62% |
Adapted from this benchmark.
Vec::new + String::to_owned |
Pool::new_rc + Pool::new_rc_from |
Improvement | Pool::new + Pool::new_from |
Improvement |
|---|---|---|---|---|
| 1303594 ns/iter (+/- 98974) | 723338 ns/iter (+/- 82782) | ~44.51% | 678324 ns/iter (+/- 88772) | ~47.97% |
Ideas and PRs welcome!
Inspired by frankmcsherry's recycler.