How is `ElementSize` defined? Creating objects (or making copies) of such objects might require memory allocation.d
-erik On Fri, Aug 19, 2016 at 8:06 AM, Uri Patish <[email protected]> wrote: > Hi, I have to following types, > > typealias ElementSize > > typealias Element Array{Float64, 3} > > type ElementBuffer > size::ElementSize > alloc::ElementSize > data::Element > end > > The following function is called many times, > > function set_size!(bf::ElementBuffer, sz::ElementSize, load_old_data::Bool > = true) > if (bf.alloc[1] < sz[1]) || (bf.alloc[2] < sz[2]) || (bf.alloc[3] < > sz[3]) > old_data = bf.data > bf.alloc = map(max, bf.alloc, sz) > bf.data = Element(bf.alloc) > if load_old_data > load_body!(bf, old_data) > end > end > bf.size = sz > nothing > end > > I've seen there is a lot of memory allocation going on, so I've > benchmarked the former code using Julia's track-allocation=user option. The > result was suprising, > > - function set_size!(bf::ElementBuffer, sz::ElementSize, > load_old_data::Bool = true) > 1710097664 if (bf.alloc[1] < sz[1]) || (bf.alloc[2] < sz[2]) || > (bf.alloc[3] < sz[3]) > 0 old_data = bf.data > 2894592 bf.alloc = map(max, bf.alloc, sz) > 59783056 bf.data = Element(bf.alloc) > 0 if load_old_data > 0 load_body!(bf, old_data) > - end > - end > 0 bf.size = sz > 0 nothing > - end > > After running the code in debug, I've seen that there is an allocation > happening every time the alloc field is accessed. If I change the field > type from a tuple to an array this phenomenon disappears. I can't figure > out why this allocation is happening, any ideas? > > Uri > > -- Erik Schnetter <[email protected]> http://www.perimeterinstitute.ca/personal/eschnetter/
