Question: Memory allocation in function


#1

Hi all,

I just want to check I have understood this right.

Example:

function Foo!(X)
X=X./2
return(X)
end

function TestFooAllocs()
A=[1 2 3];
@time A=Foo!(A);
end

Output:

0.000002 seconds (1 allocation: 112 bytes)
1×3 Array{Float64,2}:
0.5  1.0  1.5

In this example the single allocation is when I create A? I.e. when I manipulate this inside the function ‘foo’ is this assigned a new block of memory or not?

Hope my question makes sense.


#2

X./2 creates a new array, which is then bound to X. You can modify the original array with X.=X./2.


#3

Nice, working REPL example below.

function Foo!(X)
X.=X./2
return(X)
end

function FooLoop!(X)
for i=1:length(X)
	X[i]= X[i]/2
end
return(X)
end

function TestFooAllocs()
A=[1. 2. 3.];
@time A=Foo!(A);
end

function TestFooLoopAllocs()
A=[1. 2. 3.];
@time A=FooLoop!(A);
end

TestFooAllocs()
TestFooLoopAllocs()

REPL outputs:

0.000000 seconds
1×3 Array{Float64,2}:
0.5  1.0  1.5

0.000000 seconds
1×3 Array{Float64,2}:
0.5  1.0  1.5

#4

PS: also have a look at StaticArrays.jl. For small arrays those often work really well without requiring the gymnastics of in-place modifications.


#5

It is not idiomatic to treat return as a function, since it is a keyword. You should rather write

return X

For benchmarking I recommend to use BenchmarkTools.jl, that way you also get more accurate memory numbers.