#tokio-task #drop #tokio #alloc #no-alloc #no-std

no-std backdrop

使用Backdrop在后台丢弃大型或复杂对象!(稍后、在另一个线程或两者都有!完全可定制!支持Tokio!)

12个版本

0.1.11 2023年3月1日
0.1.10 2023年2月28日

#192 in 内存管理

Download history 13/week @ 2024-03-09 3/week @ 2024-03-16 8/week @ 2024-03-30 4/week @ 2024-04-06 7/week @ 2024-04-13 2/week @ 2024-04-20

58 每月下载量
backdrop_arc中使用

MIT 许可证

35KB
367

Backdrop — 最新版本 许可证 需要:rustc 1.56+

《code>backdrop crate允许您自定义何时以及如何丢弃您的值。此crate的主要入口点是Backdrop<T, Strategy>包装类型。这将使用零成本的包装器将任何'普通'类型T包装起来,并基于给定的Strategy自定义其丢弃方式。

Strategy是一种标记(零大小,仅在编译时)类型,它实现了BackdropStrategy特质。

内置策略

生产就绪

  • TrashQueueStrategy:单线程策略,将待清理对象存储在队列中,您可以稍后一次性清理。
  • TrashThreadStrategy:多线程策略,其中专用线程将在后台清理对象。
  • TokioTaskStrategyTokioBlockingTaskStrategy:在'普通'线程池(或'阻塞OK在这里'线程池)上创建新的Tokio任务,该任务将在您的热代码路径可以愉快地继续的同时清理您的对象。

还包含了一些简单的策略,以便学习或简化基准测试

  • LeakStrategy:不做任何事情,忘记您的对象并泄漏它们的内存。用于测试您的代码路径或清理策略的'下限'。
  • TrivialStrategy:通常删除对象。
  • ThreadStrategy:为每个要删除的对象创建一个新的完整的操作系统线程。这有很大的开销,但这个策略可以作为编写自己的策略的有用学习工具/起点。

当然,你也很容易创建自己的!

快速示例

use backdrop::*;

{
  // Either specify the return type:
  let mynum: Backdrop<usize, LeakStrategy> = Backdrop::new(42);

  // Or use the 'Turbofish' syntax on the function call:
  let mynum2 = Backdrop::<_, LeakStrategy>::new(42);

  // Or use one of the shorthand type aliases:
  let mynum3 = LeakBackdrop::new(42);
} // <- Because we are using the LeakStrategy, we leak memory here, rather than dropping. Fun! :-)

为了了解某些策略可能会产生多大影响,请考虑在你的机器上运行仓库中的comparison示例(cargo run --example comparison --features="tokio"),它将尝试多种包含的策略来删除一个大型数据结构(一个Box<[Box<str>; 5_000_000]>

none, took 99.785167ms
fake backdrop, took 91.171125ms

thread backdrop, took 184.708µs
trash thread backdrop, took 22.333µs

(single threaded) trash queue backdrop, took 21.542µs
(single threaded) trash queue backdrop (actually cleaning up later), took 87.6455ms

tokio task (multithread runner), took 33.875µs
tokio blocking task (multithread runner), took 55.875µs
tokio task (current thread runner), took 18.875µs
tokio blocking task (current thread runner), took 63µs

Arc

一个Backdrop<Arc<T>, S>将不会像你预期的那样工作。(更多信息请见此处)请使用来自backdrop_arc包的Arc。

MSRV

backdrop的最小支持Rust版本是Rust 1.56.1,因为我们使用了2021版Rust语法。没有(必需的)Rust功能或(必需的)依赖项,这使得这个包非常轻量级且易于移植。

依赖项

~0-6.5MB
~31K SLoC