Thanks for taking a look! I opened an issue here https://github.com/JuliaLang/julia/issues/9272
On Monday, December 8, 2014 3:36:05 PM UTC+11, Stefan Karpinski wrote: > > I did spend some time poking at this but I couldn't figure out what the > problem is on 0.3. You may want to file an issue and you may get the > attention of some other people who may figure it out faster than me. > > On Sun, Dec 7, 2014 at 9:47 PM, Will Dobbie <wdo...@gmail.com > <javascript:>> wrote: > >> I tested it on 0.4-dev+1310 and it fixed the allocations in the example >> above. But my real program was still allocating at the same spot. It seems >> to be a different issue unrelated to immutables. I've boiled it down to the >> example below. It's a little contrived as my real aim is to write to memory >> not allocated by Julia. It seems to be something to do with accessing >> arrays directly versus through a field? I've tried splitting it up into >> separate type-annotated functions but there was no change. >> >> module immtest >> >> type Container >> array::Array{Float32} >> size::Uint32 >> end >> >> function runtest(reps) >> dst = resize!(Float32[], 100_000) >> src = resize!(Float32[], 10) >> container = Container(dst, 1000) >> >> @time begin >> for i=1:reps >> # This does not cause allocation >> # copy!(dst, container.size+1, src, 1) >> >> # This does >> copy!(container.array, container.size+1, src, 1) >> end >> end >> end >> >> runtest(10_000_000) >> >> end >> >> >> >> >> On Sunday, December 7, 2014 3:06:52 AM UTC+11, Stefan Karpinski wrote: >>> >>> I can reproduce this on 0.3. Looking into it. >>> >>> On Sat, Dec 6, 2014 at 7:04 AM, Tim Holy <tim....@gmail.com> wrote: >>> >>>> Curiously, I don't even see it on my copy of julia 0.3. >>>> >>>> Will, one tip: julia optimizes within functions. Anytime you see >>>> something >>>> weird like this, try to separate allocation and operation into two >>>> separate >>>> functions. That way, the function that's performing lots of computation >>>> will >>>> receive a concrete type as an input, and be well-optimized. >>>> >>>> --Tim >>>> >>>> On Friday, December 05, 2014 06:38:28 PM John Myles White wrote: >>>> > 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 <wdo...@gmail.com> 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 >>>> >>>> >>> >