Reduce vs splat with intersect() function performance

Just trying to understand why the first sum is faster than the second.

using BenchmarkTools
const data=raw"C:\text.txt" |> read |> String |> x->split(x,r"\r\n\r\n|\n\n") .|> y->split(y,r"\r\n|\r|\n")

@btime sum(length,data .|> x->∩(x...))#Use of splat

@btime sum(length,data .|> x->reduce(∩, x))#use of reduce
1.620 ms (14963 allocations: 1.24 MiB)
2.253 ms (22777 allocations: 1.76 MiB)


You may look at the implementation of intersect here:

reduce(∩, [a, b, c, d]) == ∩(a, ∩(b, ∩(c, d)))

And the 2-argument intersect allocates a new destination each time, whereas the arbitrary elements intersect reuses the destination of 1 intersect call and then calls intersect! on that.