生锈:将较重的东西放入另一个线程可以使您的代码速度提高10000倍

2020-05-31 01:11:23

在处理需要以最快速度向最终用户显示内容的Rust应用程序或CLI时,我经常发现,大量时间通常不是花在做任何计算上,而是花在删除函数末尾的大型数据结构上。

例如,假设您有一个函数,该函数获取一些较重的对象并返回其大小:

弄到a的大小是非常便宜的。它大约需要0.01ms,但是整个函数在返回任何东西之前可能需要1000ms,这是因为Rust需要丢弃a的值并释放它在返回之前使用的所有内存。

如果HeavyThing是一个非常复杂的数据结构,那么释放它正在使用的所有内存可能需要一段时间。

对于UI和交互式CLI来说,这真的很糟糕。我们已获得响应用户请求所需的所有数据,但在我们完成清理之前,无法对其执行任何操作!

解决此问题的方法之一是推迟丢弃该值,方法是将其移动到另一个线程,让它来处理它。

在本例中,我们生成另一个线程,将繁重的数据结构移入其中,然后开始执行。该函数立即返回,并且在将来的某个地方,另一个线程将开始执行删除数据结构和释放所有已用内存的工作。

这里是一个使用具有1M个密钥的HashMap&usize,Vec<;usize;&>数据结构的小示例。延迟放置到另一个therad的功能执行速度大约快10K倍。这是一个使用HashMap<;usize,Vec<;usize&>数据结构的小示例,该数据结构有1M个密钥