结构体数组所有元素(1亿个元素)初始化为相同的值

2024-02-10 20:04

本文主要是介绍结构体数组所有元素(1亿个元素)初始化为相同的值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一个结构体数组,有1亿个元素,每个元素都要初始化为相同的值,如果没有现成的语法直接支持这样的初始化操作,就得用for循环写,会不会非常耗时?

如果结构体里的成员都是一些简单的基本数据类型,整个结构体才几十个字节,即使有1亿个元素,用for循环赋值,程序执行时间也只要10^8纳秒级别,0.1秒的样子。编译器优化+高速缓存命中,速度已经飞快了,不用操心那么多。循环展开这些优化方法,编译器优化都可能帮你做了,手动优化代码可能基本没效果(1e8+5即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个线程以上基本没有加速效果了,猜测是硬件资源的并行度有限(这样说可能不准确),可能是竞争之类的原因导致的,或者是因为总线宽度有限?

这篇关于结构体数组所有元素(1亿个元素)初始化为相同的值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697951

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(