繁体   English   中英

如果没有提供默认大小,Vec 何时重新分配?

[英]When does a Vec reallocate if no default size is provided?

我目前正在学习 Rust,为了能够创建更高效​​的代码,我想了解一些方面,所以问题是, Vec::new()的默认大小是多少,何时重新分配如果超过默认大小? 一旦它们足够长,我在使用向量时会看到一些性能问题(我认为这是主要原因)。 该向量具有Vec<u8>值,因此,结果向量如下所示

let items: Vec<Vec<u8>> = Vec::new();

我正在做大量插入只是为了看看它是否能够处理数百万个值,但是一旦它达到约 30k 值,插入过程往往会加倍时间,随着时间的推移,它会再次加倍。

我想在向量中存储一些标识符,以便稍后在向量上为 API 实现一些分页,但我认为使用无界向量会导致这个问题,我不确定。

除了使用向量之外,我还同时使用 Hashmap 来插入Vec<u8>键和一些对象作为值,因此 Hashmap 也可能是问题所在。

Vec::new()的默认大小是多少

在元素被推到它上面之前,向量不会分配。

如果超过默认大小,何时重新分配

未指定,但 目前的增长率是之前容量的 2倍( 从 1/4/8 开始,具体取决于元素大小)。 也就是说,每次推送一个新元素时,向量的大小都会翻倍,并且没有剩余容量。 这通常是一个不错的增长率,但如果您插入大量元素,您确实会以非常糟糕的性能和内存使用结束,因为您可能分配大约两倍您需要的内存,并且最后一次重新分配可能需要非常大的副本。

请注意,并非每次您都一个接一个地增长 - 例如,如果您通过迭代器extend() (或collect()一个迭代器),迭代器可能知道它的确切大小并且只分配一次。

如果您提前知道所需的元素数量,则可以调用with_capacity()reserve_exact以确保向量仅分配一次。

您可以检查具有capacityVec中有多少可用空间。 当您超出其容量(默认为 0)时, Vec会重新分配。

但是请注意,当Vec重新分配时,它会分配一些额外的容量,因此它不需要在每次插入时重新分配。 事实上,可以保证推送到Vec总是需要摊销的常数时间。 有关详细信息,请参阅容量和重新分配

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM