c++ - 为什么许多小的 memcpy 比一个大的 memcpy 快?
问题描述
我发现拥有许多小的 memcpy 比拥有一个大的 memcpy 更快。我不明白为什么会这样。memcpy 不是更擅长复制一大块数据吗?
我已经在 VC++ 2017 和 Intel 编译器 2018 上测试了以下代码。
一个大型 memcpy 的时间:0.457913 和许多小型 memcpy 的时间:0.121063
typedef double tp;
size_t sz = 100;
size_t nm = 1000000;
tp* x = new tp[sz*nm];
std::vector<tp*> y(nm);
for (int i = 0; i < nm; ++i)
y[i] = new tp[sz];
tp* z1 = new tp[sz*nm];
std::vector<tp*> z2(nm);
for (int i = 0; i < nm; ++i)
z2[i] = new tp[sz];
double currTime, lastTime;
lastTime = omp_get_wtime();
memcpy((void*)z1, (void*)x, sizeof(tp)*sz*nm);
currTime = omp_get_wtime();
std::cout << "time for one large memcpy: " << currTime - lastTime << std::endl;
lastTime = omp_get_wtime();
for (int i = 0; i < nm; ++i)
memcpy((void*)z2[i], (void*)y[i], sizeof(tp)*sz);
currTime = omp_get_wtime();
std::cout << "time for many small memcpy: " << currTime - lastTime << std::endl;
delete[] x;
delete[] z1;
for (int i = 0; i < nm; ++i)
{
delete[] y[i];
delete[] z2[i];
}
解决方案
推荐阅读
- sql - SQL Join 未按预期过滤 SSMS
- c# - 在 Unity3D 中控制游戏对象时传送
- reactjs - 在区块链上存储散列(存储在 ipfs 上的图像散列)
- reactjs - 用排序反应数据表列过滤器问题
- mysql - SQL - 选择列包含关键字并具有相同类别的记录
- javascript - 如何在 date-fns 中格式化小时和分钟?
- laravel - 默认路由不适用于 laravel 和 vue
- python - 如何返回由 Python 列表中的连续数字组成的最长子序列?
- javascript - 如何将未转义的字符串插值传递给脚本标签?
- java - Swagger 开放 API 定义不适用于 Micronaut JWT 安全 Micronaut 版本 2.2.1