# Assigning values in for loop allocates memory

**URL:** <https://discourse.julialang.org/t/assigning-values-in-for-loop-allocates-memory/70851>\
**Category:** Performance\
**Tags:** memory-allocation\
**Created:** [November 3, 2021, 8:29am UTC](https://discourse.julialang.org/t/assigning-values-in-for-loop-allocates-memory/70851 "2021-11-03T08:29:05Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mikhail\_Kagalenko](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mikhail_kagalenko/32/13257_2.png) [@Mikhail\_Kagalenko](https://discourse.julialang.org/u/Mikhail_Kagalenko)\
**Post date:** [November 3, 2021, 8:29am UTC](https://discourse.julialang.org/t/assigning-values-in-for-loop-allocates-memory/70851/1 "2021-11-03T08:29:05Z")

</div>

Why would that loop allocate anything at all?

```julia
julia> (M, N) = (512, 2048)
       A=zeros(M, N)
       v=zeros(M)
       @btime for k in 1:N
         v .= randn()
         A[:, k] = v
       end
  2.502 ms (10756 allocations: 200.08 KiB)

```

The loop below allocates so much more, why?

```julia
julia> @btime for k in 1:N
         v .= randn()
         for m in 1:M
            A[m, k] = v[m]
         end
       end
  112.815 ms (2110467 allocations: 48.27 MiB)

```

---

<div class="post-metadata">

**Author:** ![goerch](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/goerch/32/29122_2.png) [@goerch](https://discourse.julialang.org/u/goerch)\
**Post date:** [November 3, 2021, 8:35am UTC](https://discourse.julialang.org/t/assigning-values-in-for-loop-allocates-memory/70851/2 "2021-11-03T08:35:13Z")

</div>

Maybe because you are measuring in global scope. Rewritten MWE

```julia
using BenchmarkTools

function test1()
    (M, N) = (512, 2048)
    A=zeros(M, N)
    v=zeros(M)
    for k in 1:N
        v .= randn()
        A[:, k] = v
    end
end

function test2()
    (M, N) = (512, 2048)
    A=zeros(M, N)
    v=zeros(M)
    for k in 1:N
        v .= randn()
        for m in 1:M
            A[m, k] = v[m]
        end
    end
end

@btime test1()
@btime test2()

```

shows

```julia
  2.234 ms (3 allocations: 8.00 MiB)
  2.337 ms (3 allocations: 8.00 MiB)

```

for me on Julia 1.6.3.

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [November 3, 2021, 8:36am UTC](https://discourse.julialang.org/t/assigning-values-in-for-loop-allocates-memory/70851/3 "2021-11-03T08:36:44Z")

</div>

I suggest reading through [Performance Tips · The Julia Language](https://docs.julialang.org/en/v1/manual/performance-tips/) before doing any performance measuring. It’s quite useful. The problem here is actually the first point on of the tips.

---

<div class="post-metadata">

**Author:** ![Mikhail\_Kagalenko](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mikhail_kagalenko/32/13257_2.png) [@Mikhail\_Kagalenko](https://discourse.julialang.org/u/Mikhail_Kagalenko)\
**Post date:** [November 3, 2021, 5:00pm UTC](https://discourse.julialang.org/t/assigning-values-in-for-loop-allocates-memory/70851/4 "2021-11-03T17:00:28Z")

</div>

> [@kristoffer.carlsson](#):
>
> I suggest reading through [Performance Tips · The Julia Language](https://docs.julialang.org/en/v1/manual/performance-tips/)

Always a good advice. I actually did, but too long time ago.
