http://www.perlmonks.org?node_id=275924


in reply to Slowness when inserting into pre-extended array

Pre-extending can be very worthwhile if you undo it first. As tilly has pointed out, preextending the array gives you a bigger array filled with undefs and pushing on the end just makes it even bigger, since you're not overwriting any of those undefs. What you should do instead is:
$#foo = 1_000_000; $#foo = 0;
This will make the array big enough to hold 1 million elements (use whatever size you really need) then set it to be holding zero elements but.... perl doesn't release the memory it allocated to the array--it's still there, attached to the array, as a ready cache. When you push onto the array perl will reuse this space until you run out past where you pre-extended.