网站的内容管理,网站的构成元素,之江建设工程质量安全监督网站,2017年最新网站设计风格一个结构体数组#xff0c;有1亿个元素#xff0c;每个元素都要初始化为相同的值#xff0c;如果没有现成的语法直接支持这样的初始化操作#xff0c;就得用for循环写#xff0c;会不会非常耗时#xff1f;
如果结构体里的成员都是一些简单的基本数据类型#xff0c;整…一个结构体数组有1亿个元素每个元素都要初始化为相同的值如果没有现成的语法直接支持这样的初始化操作就得用for循环写会不会非常耗时
如果结构体里的成员都是一些简单的基本数据类型整个结构体才几十个字节即使有1亿个元素用for循环赋值程序执行时间也只要10^8纳秒级别0.1秒的样子。编译器优化高速缓存命中速度已经飞快了不用操心那么多。循环展开这些优化方法编译器优化都可能帮你做了手动优化代码可能基本没效果1e85即1亿零5个元素多出5个零头是为了回头测试多线程对不对
#include iostream
using namespace std;struct Test
{char a;int b;float c;
};int main()
{clock_t t1 clock();const int data_num 1e8 5;Test* array new Test[data_num];if (array NULL){cout memory alloc error endl;return -1;}array[0].a a;array[0].b 123;array[0].c 123.45;for (int i 1; i data_num; i){array[i] array[0];}cout array[data_num - 1].a endl;cout array[data_num - 1].b endl;cout array[data_num - 1].c endl;clock_t t2 clock();cout t2 - t1 毫秒 endl;return 0;
} 下面使用多线程而且每个线程使用翻倍memcpy按1、2、4、8……翻倍进行copy
#include thread
#include iostream
using namespace std;struct Test
{char a;int b;float c;
};const int data_num 1e8 5;
const int thread_num 4;void memcpy_thread(Test* array, int tid)
{int base_pos data_num / thread_num * tid;int cur_pos 1;while (cur_pos * 2 data_num / thread_num){memcpy_s(array base_pos cur_pos, sizeof(Test) * cur_pos, array base_pos, sizeof(Test) * cur_pos);cur_pos * 2;}memcpy_s(array base_pos cur_pos, sizeof(Test) * (data_num / thread_num - cur_pos), array base_pos, sizeof(Test) * (data_num / thread_num - cur_pos));
}int main()
{clock_t t1 clock();Test* array new Test[data_num];if (array NULL){cout memory alloc error endl;return -1;}for (int i 0; i thread_num; i){int index data_num / thread_num * i;array[index].a a;array[index].b 123;array[index].c 123.45;}thread td[thread_num];for (int i 0; i thread_num; i){td[i] thread(memcpy_thread, array, i);}for (int i 0; i thread_num; i){td[i].join();}for (int i data_num / thread_num * thread_num; i data_num; i){array[i].a a;array[i].b 123;array[i].c 123.45;}cout array[data_num - 1].a endl;cout array[data_num - 1].b endl;cout array[data_num - 1].c endl;clock_t t2 clock();cout t2 - t1 毫秒 endl;return 0;
} 1亿零5个元素多出5个零头是为了测试多线程对不对多线程翻倍memcpy用时大概70毫秒。之前直接用for循环用时大概150毫秒多线程和翻倍memcpy的加速效果似乎都不明显。多线程加速效果不明显3个线程以上基本没有加速效果了猜测是硬件资源的并行度有限这样说可能不准确可能是竞争之类的原因导致的或者是因为总线宽度有限