Vector filtering performance and... gc?

I have vecs::Vector{Vector{Float32}} (really, the columns of a dataframe), each of which has length of 300000. I’m interested in the performance of v[t], where t is a BitVector. I’m finding that performance is strangely bimodal. Why?

# t = rand(Bool, length(vecs[1]))
p = plot(ylim=[0.0003,0.001], legend=false)
gc_enable(false)
for i in 1:10
    plot!([@elapsed(v[t]) for v in vecs])
end
gc_enable(true)
p

image

If I leave the gc on, I get more jumps

image

In the above, mean(t) is 0.75, but it has long stretches of true and false. If I use t = rand(Bool, length(vecs[1])), then the bimodality disappears.

image

Am I seeing memory hierarchy effects? GC generations?