a 的默认大小是多少Vec::new()?如果超过默认大小,何时重新分配?一旦向量增长足够,我在使用向量时会遇到一些性能问题(我认为这是主要原因)。该向量具有Vec<u8>值,因此所得向量如下所示
let items: Vec<Vec<u8>> = Vec::new();
Run Code Online (Sandbox Code Playgroud)
我正在进行大量插入,只是为了看看它是否能够处理数百万个值,但是一旦达到约 30k 个值,插入过程往往会增加一倍的时间,并且随着时间的推移,它会再次增加一倍。
我想在向量中存储一些标识符,以便稍后在 API 的向量上实现一些分页,但我认为使用无界向量会导致此问题,我不确定。
除了使用向量之外,我还HashMap同时使用 a 来插入Vec<u8>键和一些对象作为值,所以HashMap也可能是问题。
a 的默认大小是多少
Vec::new()
零:
在将元素推入向量之前,向量不会分配。
如果超过默认大小,什么时候重新分配
未明确,但目前增长率是之前容量的 2 倍(从 1/4/8 开始,具体取决于单元大小)。也就是说,每次推送新元素时,向量的大小都会增加一倍,并且没有剩余容量。这通常是一个不错的增长率,但如果您插入大量元素,您确实可能会得到非常糟糕的性能和内存使用,因为您可能会分配大约两倍的所需内存,并且最后的重新分配可能需要非常大的副本。
请注意,并非每次您都一一增长 - 例如,如果您extend()通过迭代器(或collect()迭代器),则迭代器可能知道其确切大小并仅分配一次。
如果您提前知道所需的元素数量,则可以调用with_capacity()或reserve_exact()以确保向量仅分配一次。