Code: Select all
#include
#include
using namespace std;
alignas(4096) unsigned char v[1024 * 1024];
void bm_memmove(benchmark::State& state) {
const auto size = static_cast(state.range(0));
const auto n = static_cast(state.range(1));
const size_t n1 = n < 0 ? 0 : n;
const size_t n0 = n < 0 ? -n : 0;
benchmark::DoNotOptimize(v);
for (auto _ : state) {
memmove(v + n0, v + n1, size);
benchmark::DoNotOptimize(v);
}
}
BENCHMARK(bm_memmove)->ArgsProduct({{8191, 8193}, {-5, +5}});
BENCHMARK_MAIN();
< /code>
Die Ausgabe für mich am 12. Gen Intel (R) Core (TM) i5-1235u und die neueste MSVC lautet wie folgt: < /p>
2025-05-13T12:13:36+03:00
Running out\bench\benchmark-memmove.exe
Run on (12 X 2496 MHz CPU s)
CPU Caches:
L1 Data 48 KiB (x6)
L1 Instruction 32 KiB (x6)
L2 Unified 1280 KiB (x6)
L3 Unified 12288 KiB (x1)
-------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------
bm_memmove/8191/-5 71.4 ns 71.5 ns 8960000
bm_memmove/8193/-5 71.1 ns 71.5 ns 8960000
bm_memmove/8191/5 62.6 ns 61.0 ns 8960000
bm_memmove/8193/5 1903 ns 1925 ns 373333
https://quick-fench.com/q/mqxznxpvzbrf6ab5aaOsholnho 4
gcc 13.2 ist fein: />https://quick-tench.com/q/zh-s5bpzcjltzzdm982Byoa4o9w
manchmal über AVX2-Anweisungen implementiert ist, der problematische Fall ist nur repsb . Ich denke, es ist das gleiche für Clang.0x140125e40 push rdi
0x140125e41 push rsi
0x140125e42 mov rdi, rcx
0x140125e45 mov rsi, rdx
0x140125e48 mov rcx, r8
0x140125e4b rep movsb byte ptr [rdi], byte ptr [rsi]
0x140125e4d pop rsi
0x140125e4e pop rdi
0x140125e4f ret
< /code>
Der gleiche Benchmark zeigt dieses Problem in meiner älteren Hardware (Intel (R) Core (TM) i7-8750H) nicht an: < /p>
2025-05-13T15:22:03+03:00
Running benchmark-memmove.exe
Run on (12 X 2208 MHz CPU s)
CPU Caches:
L1 Data 32 KiB (x6)
L1 Instruction 32 KiB (x6)
L2 Unified 256 KiB (x6)
L3 Unified 9216 KiB (x1)
-------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------
bm_memmove/8191/-5 143 ns 141 ns 4977778
bm_memmove/8193/-5 145 ns 146 ns 4480000
bm_memmove/8191/5 77.2 ns 76.7 ns 8960000
bm_memmove/8193/5 80.9 ns 80.2 ns 8960000
< /code>
Auch die Ergebnisse auf i5-1235u sehen nicht schlecht aus, wenn Sie die Affinität zu E-Core festlegen: < /p>
-------------------------------------------------------------
Benchmark Time CPU Iterations
-------------------------------------------------------------
bm_memmove/8191/-5 131 ns 131 ns 5600000
bm_memmove/8193/-5 136 ns 135 ns 4977778
bm_memmove/8191/5 124 ns 123 ns 5600000
bm_memmove/8193/5 179 ns 180 ns 4072727
< /code>
Das Problem wird auch auf i5-11400h (Tigersee) und Xeon Platinum 8362 (ICE Lake) beobachtet. Bibliotheken werden behoben?