[英]Why are standard string functions faster than my custom string functions?
[英]Why C++ standard string copy is faster than string move?
認為字符串復制操作應該比移動慢,但基准測試表明它更快。
static void StringCreationMove(benchmark::State & state) {
std::string x = "hello";
for (auto _ : state) {
std::string created_string_move(std::move(x));
benchmark::DoNotOptimize(created_string_move);
}
}
BENCHMARK(StringCreationMove);
static void StringCreationCopy(benchmark::State & state) {
std::string x = "hello";
for (auto _ : state) {
std::string created_string_copy(x);
benchmark::DoNotOptimize(created_string_copy);
}
}
BENCHMARK(StringCreationCopy);
如果move
沒有分配 memory,為什么它很慢? 或者,這個基准本身可能有問題。
更新
更新的版本可能會反映更多的見解。
#include <benchmark/benchmark.h>
static void StringCreationMove(benchmark::State & state) {
for (auto _ : state) {
std::string x = "hello";
benchmark::DoNotOptimize(x);
std::string created_string_move(std::move(x));
benchmark::DoNotOptimize(created_string_move);
}
}
BENCHMARK(StringCreationMove);
static void StringCreationCopy(benchmark::State & state) {
for (auto _ : state) {
std::string x = "hello";
benchmark::DoNotOptimize(x);
std::string created_string_copy(x);
benchmark::DoNotOptimize(created_string_copy);
}
}
BENCHMARK(StringCreationCopy);
BENCHMARK_MAIN();
結果在我的 MacBook Air 2013 上。
Run on (4 X 1300 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x2)
L1 Instruction 32 KiB (x2)
L2 Unified 256 KiB (x2)
L3 Unified 3072 KiB (x1)
Load Average: 1.51, 1.49, 1.74
-------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------
StringCreationMove 72.0 ns 67.6 ns 11394713
StringCreationCopy 47.1 ns 47.1 ns 14960781
如果您使用標准的 libstd++ (GNU) 或 libc++ (llvm),基准測試結果會有所不同。 最后給出的移動速度更快: https://quick-bench.com/q/DV-lRSuipynW2QilZZvCV91uWHY
至於你的問題的答案。 字符串“hello”太短,應用了小字符串優化。 這意味着一個小數組用於小字符串,因此沒有移動的優勢。 這取決於實現,但可能 GNU std::string 在執行移動時不會以最佳方式復制數組的數據。 如果你使用足夠長的弦,移動總是更快。
GNU: https://quick-bench.com/q/QFlfvUJ_Rua6g95koevFZsNaLrg LLVM: https://quick-bench.com/q/iJgfzrWc3yNUMkBYnbPI02e1lW4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.