optimise and test spread()