Почему Rep Movsb медленно для перекрывающегося вперед Memmove, и почему LIBC использует его?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему Rep Movsb медленно для перекрывающегося вперед Memmove, и почему LIBC использует его?

Сообщение Anonymous »

tl; dr: memmove , который использует rep movsb , является медленным массивом на перекрывающемся массиве 8193 байтов по сравнению с memmove для 8191 элементов, которые не используют rep movsb .
Я спрашиваю, почему. Clackmark: < /p>

Код: Выделить всё

#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>
Вывод для меня на 12-м поколении Intel (R) Core (TM) I5-1235U и последнее MSVC выглядит следующим образом: < /p>


Подробнее здесь: [url]https://stackoverflow.com/questions/79619377/why-is-rep-movsb-slow-for-overlapping-forward-memmove-and-why-does-libc-use-it[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»