I think this might be a problem with Julia 0.3. I see it on Julia 0.3, but not on the development branch for Julia 0.4.
— John On Dec 5, 2014, at 6:27 PM, Will Dobbie <[email protected]> wrote: > Hi, > > I have a program which copies elements between two arrays of immutables in a > tight loop. The sizes of the arrays never change. I've been struggling to get > it to avoid spending a large chunk of its time in the garbage collector. I > have an example of what I mean below. > > With arrays of Int64 I get: > elapsed time: 0.164429425 seconds (0 bytes allocated) > > With arrays of an immutable the same size as Int64 I get: > elapsed time: 1.421834146 seconds (320000000 bytes allocated, 15.97% gc time) > > My understanding was arrays of immutables should behave like arrays of > structs in C and not require heap allocation. Is there a way I can achieve > that? I'm using Julia 0.3.3. > > Thanks, > Will > > > > module immtest > > immutable Vec2 > x::Float32 > y::Float32 > end > > # typealias element_type Vec2 # Results in allocation in the loop > below > typealias element_type Int64 # Does not cause allocation > > function runtest(reps) > dst = resize!(element_type[], 100_000) > src = resize!(element_type[], 10) > > @time begin > for i=1:reps > copy!(dst, 1000, src, 1, length(src)) > # dst[1000:1009] = src # same performance as > above > end > end > end > > runtest(10_000_000) > > end >
