I have a black box variable x::Vector{Char}
which satisfies length(x) < 20
(actually, it is not a black box because it is open source, but I do not understand how it behaves yet because I have not read the implementation in detail). Furthermore, the program uses string(x...)
to convert x
to String
. I think join(x)
do the same thing. Which is better?
Just do String(x)
. That should also reuse the memory. It does not for Vector{Char}
but nonetheless is by far the fastest option.
It’s approximately 6.67 times faster than string(x...)
! Thanks!
Btw, these benchmarks are not quite accurate because x is untyped global and accessing these is slow. See the Performance tips (also a good read if you care about performance in Julia generally ). To avoid this in benchmark use interpolation with $
.
I just put all these methods into functions and these are my results:
julia> using BenchmarkTools
julia> f1(x) = String(x)
julia> f2(x) = string(x...)
julia> f3(x) = join(x)
julia> x = rand(Char, 20);
julia> @btime f1($x);
76.042 ns (1 allocation: 104 bytes)
julia> @btime f2($x);
882.564 ns (21 allocations: 424 bytes)
julia> @btime f3($x);
846.847 ns (5 allocations: 416 bytes)
julia> x = rand(Char, 2000);
julia> @btime f1($x);
7.979 μs (1 allocation: 7.81 KiB)
julia> @btime f2($x);
69.075 μs (2002 allocations: 54.81 KiB)
julia> @btime f3($x);
66.002 μs (9 allocations: 11.73 KiB)
So for me the difference is more like ~9 times faster and also less allocations
What actually happens when you splat 2000 values? I feared everything would go crazy, but apparently not.
Hello,
As per me for converting a small Vector{Char}
(x
) into a String
, string(x...)
is generally better due to its straightforward and efficient conversion without needing a separator. It’s ideal for cases where length(x) < 20
and offers simplicity in implementation.
I hope this will help you,
Thank you
How is this better than String(x)
? It’s less efficient, and more complicated.