Your vector type is not concrete.

Use:

Pts = Array(Point{Float64},10)

and fix your method definition, i.e.

function fillpts!{T <: AbstractFloat}(PointVec::Vector{Point{T}})



On Wednesday, January 27, 2016 at 7:39:19 AM UTC+1, Nitin Arora wrote:
>
> First of all thanks to all of those who answered questions in my previous 
> post.
>
> I ran into another, rather confusing behavior:
>
> Say we define an immutable type as:
> immutable Point{T<:AbstractFloat}
>   state    :: Vector{T} # State Vector (length = 6)
>   dstate   :: Vector{T} # Derivative vector wrt. time (length = 6)
>   ct       :: Vector{T} #control vector
>   id       :: Int64 # is an input
>   cb       :: T # is an input
> end
>
> Pts = Array(Point,10)
>
>
> Now Let us define a function which can initialize the variable "Pts" above 
> ( an array of Points ):
> function fillpts!(PointVec::Vector{Point})
>   for j = 1:10
>     states = rand(6); dstates = rand(6); ctrl =  rand(4); tar =  1; cb = 
> rand(1)[1]
>     PointVec[j]  = 
> Point{Float64}(copy(states),copy(dstates),copy(ctrl),tar,cb)
>   end
>   return nothing
> end
>
> fillpts!(Pts)
>
> Now Lets define two functions (one works on array of Point, other one a 
> single Point type) which check for memory allocations when accessing the 
> member variables:
> function checkAllocation(P::Vector{Point})
>   @time for i = 1:10000
>     P[1].state[1] 
>   end
>   @time for i= 1:10000
>    P[1].cb 
>  end
>  @time for i =1:10000
>   P[1].id 
>  end
>   return nothing
> end
> #------------------------------------------
> function checkAllocation_Single(P::Point)
>   @time for i = 1:10000
>     P.state[1]  
>   end
>   @time for i= 1:10000
>    P.cb 
>  end
>  @time for i =1:10000
>   P.id 
>  end
>   return nothing
> end
>
> Finally, the result of the benchmarking is as follows:
> checkAllocation(Pts)
> # Results
> # 0.000459 seconds (10.00 k allocations: 156.250 KB)
> # 0.000234 seconds (10.00 k allocations: 156.250 KB)
> # 0.000126 seconds
>
> checkAllocation_Single(Pts[1])
> # Results
> # 0.000003 seconds
> # 0.000000 seconds
> # 0.000000 seconds
>
> *My Question:*
> For the first function checkAllocation, which works on array on immutable 
> composite type, why do I get memory allocation when accessing an array or a 
> Float64 , but none when I access an integer (the sub variable "id") ? This 
> seems very strange to me. Whats so special about a Float ?
> I was hoping and expecting to be no memory allocation for accessing these 
> values.
> This behavior is more in line with what I expected with the second 
> function, where we see no memory allocation.
>
> Can someone more knowledgable please explain whats going on here ? I am 
> really confused. 
>
> again, thanks for the help!
> Nitin
>
>
>
>
>
>

Reply via email to