簡體   English   中英

為什么 C++ 標准字符串復制比字符串移動快?

[英]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 “你好”+ LLVM 標准 C++ 庫

至於你的問題的答案。 字符串“hello”太短,應用了小字符串優化。 這意味着一個小數組用於小字符串,因此沒有移動的優勢。 這取決於實現,但可能 GNU std::string 在執行移動時不會以最佳方式復制數組的數據。 如果你使用足夠長的弦,移動總是更快。

GNU: https://quick-bench.com/q/QFlfvUJ_Rua6g95koevFZsNaLrg “早上好,世界!聖誕快樂!” + GNU 標准 C++ 庫 LLVM: https://quick-bench.com/q/iJgfzrWc3yNUMkBYnbPI02e1lW4 “早上好,世界!聖誕快樂!” + LLVM 標准 C++ 庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM