[英]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
以确保向量仅分配一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.