, 2 min read
Move or copy your strings? Possible performance impacts
You sometimes want to add a string to an existing data structure. For example, the C++17 template ‘std::optional’ may be used to represent a possible string value. You may copy it there, as this code would often do…
std::string mystring;
std::optional<std::string> myoption;
myoption = mystring;
Or you can move it:
std::string mystring;
std::optional<std::string> myoption;
myoption = std::move(mystring);
In C++, when ‘moving’ a value, the compiler does not need to create a whole new copy of the string. So it is often cheaper.
I wrote a little benchmark to assess the performance difference. It is a single test, but it should illustrate.
Firstly, for relatively long strings (a phrase or a sentence), the move is 5 times to 20 times faster.
copy | move | |
---|---|---|
Apple LLVM 14, M2 processor | 24 ns/string | 1.2 ns/string |
GCC 11, Intel Ice Lake | 19 ns/string | 4 ns/string |
Secondly, for short strings (a single word), the move is 1.5 times to 3 times faster but the absolute difference is small (as small as a fraction of a nanosecond). Your main concern should be with long strings.
copy | move | |
---|---|---|
Apple LLVM 14, M2 processor | 2.0 ns/string | 1.2 ns/string |
GCC 11, Intel Ice Lake | 7 ns/string | 2.6 ns/string |
My results illustrate that moving your sizeable data structure instead of copying them is beneficial.
But that’s not the fastest approach: the fastest approach is to just hold a pointer. Copying an address is unbeatably fast. A slightly less optimal approach is to use a lightweight object like an std::string_view: copying or creating an std::string_view is cheaper than doing the same with a C++ string.