# Avoid allocations for string concatenation

**URL:** <https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666>\
**Category:** Performance\
**Tags:** performance, strings\
**Created:** [October 6, 2023, 3:28pm UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666 "2023-10-06T15:28:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![pjuergens](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pjuergens/32/28380_2.png) [@pjuergens](https://discourse.julialang.org/u/pjuergens)\
**Post date:** [October 6, 2023, 3:28pm UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666/1 "2023-10-06T15:28:25Z")

</div>

Hei together,

I realised with the allocation profiler that our model allocates a lot when concatenating strings like `"a" * "b"`. Is there a way to avoid allocation in such cases? I tried with `InternedStrings` and `intern("a" * "b")`, but that didn’t change anything…

Happy to hear any suggestions.

Patrick

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [October 6, 2023, 4:04pm UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666/2 "2023-10-06T16:04:12Z")

</div>

concatenation necessarily allocates. That said, using an `IOBuffer` if you are concatenating a lot of strings into 1 is a good idea.

---

<div class="post-metadata">

**Author:** ![simeonschaub](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simeonschaub/32/216566_2.png) [@simeonschaub](https://discourse.julialang.org/u/simeonschaub)\
**Post date:** [October 6, 2023, 5:37pm UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666/3 "2023-10-06T17:37:14Z")

</div>

In Julia 1.8+ there’s a `LazyString` type which you might want to try to represent `"a" * "b"` instead. Note that `LazyString` construction still allocates the wrapper and a tuple though, so this is probably only worthwhile for concatenating larger strings.

For small strings, you might want to consider [GitHub - JuliaString/ShortStrings.jl: A fast implementation of short strings of fixed size. Great for sorting and group-by operations](https://github.com/JuliaString/ShortStrings.jl)

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [October 6, 2023, 6:09pm UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666/4 "2023-10-06T18:09:11Z")

</div>

You could try StaticStrings.jl:

```julia-repl
julia> using StaticStrings

julia> StaticString((Tuple(static"ab")..., Tuple(static"cdef")...))
static"abcdef"6

julia> @allocated StaticString((Tuple(static"ab")..., Tuple(static"cdef")...))
0

```

Maybe this should be the default concatenation method for `StaticString`.

---

<div class="post-metadata">

**Author:** ![kevbonham](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kevbonham/32/216165_2.png) [@kevbonham](https://discourse.julialang.org/u/kevbonham)\
**Post date:** [October 6, 2023, 7:22pm UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666/5 "2023-10-06T19:22:22Z")

</div>

> [@pjuergens](#):
>
> `intern("a" * "b")`, but that didn’t change anything…

Don’t know anything about interned strings, but I think this would evaluate `"a" * "b"` first, and then call `intern()` on the result, so not surprised that it didn’t change. Can you `intern("a") * intern("b")` or something?

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [October 7, 2023, 3:35am UTC](https://discourse.julialang.org/t/avoid-allocations-for-string-concatenation/104666/6 "2023-10-07T03:35:14Z")

</div>

```julia-repl
julia> function Base.:*(a::StaticString{N}, b::StaticString{M}) where {N,M}
           t_a = Tuple(a)
           t_b = Tuple(b)
           StaticString(ntuple(N+M) do i
               if i <= N
                   t_a[i]
               else
                   t_b[i-N]
               end
           end)
       end

julia> static"abc" * static"defgh"
static"abcdefgh"8

julia> @allocated static"abc" * static"defgh"
0

```

Should we do this?
