vector、heap数组、stack数组访问性能验证

2024-05-08 15:52

本文主要是介绍vector、heap数组、stack数组访问性能验证,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

测试目的

本次测试旨在比较不同数据结构(vector、数组)以及不同访问方法([]at()offset)在性能上的差异,从而为开发者提供在特定情境下做出最佳选择的依据。

测试代码

测试网址:Quick C++ Benchmarks

使用GCC9.5 C++14 -O2编译

#include <benchmark/benchmark.h>static void vector_access(benchmark::State& state) {std::vector<int> v;for (int i = 0; i < 1000; ++i) {v.push_back(i);}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {v[i] += 1;}}
}
BENCHMARK(vector_access);static void vector_access_by_at(benchmark::State& state) {std::vector<int> v;for (int i = 0; i < 1000; ++i) {v.push_back(i);}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {v.at(i) += 1;}}
}
BENCHMARK(vector_access_by_at);static void array_access(benchmark::State& state) {int a[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {a[i] += 1;}}
}
BENCHMARK(array_access);static void array_access_by_offset(benchmark::State& state) {int a[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {*(a + i) += 1;}}
}
BENCHMARK(array_access_by_offset);static void heap_access(benchmark::State& state) {int *a = new int[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {a[i] += 1;}}delete[] a;
}
BENCHMARK(heap_access);static void heap_access_by_offset(benchmark::State& state) {int *a = new int[1000];for (int i = 0; i < 1000; ++i) {a[i] = i;}for (auto _ : state) {for (int i = 0; i < 1000; ++i) {*(a + i) += 1;}}delete[] a;
}
BENCHMARK(heap_access_by_offset);

运行结果

Quick C++ Benchmarks

结论

  • vector at()方法访问速度最慢

  • 栈上访问最快

  • 其它情况经过O2优化后性能类似。

指导意见

  • 追求最高效的访问速度:如果性能是首要考虑因素,建议使用栈上数组并采用[]访问方法。

  • 避免使用vectorat()方法:在对性能要求较高的场景下,应避免使用vectorat()方法,转而使用[]访问方法。

这篇关于vector、heap数组、stack数组访问性能验证的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

20170723 做的事 ecdsa的签名验证时间短于bls signature

1 今天在虚拟机 /home/smile/Desktop/20170610/Test//time_ecdsa 文件夹下,找到ecdsa的验证时间是 989.060606μs μs 先 make ,然后run。 再取BLS的签名生成时间: ./run  2  gnuplot 画图,画对比的时间 gnuplot 画图参考教程 http://blog.sciencen

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想 三刷小梅哥视频总结! 小梅哥https://www.corecourse.com/lander 一、DDS简介         DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

Java中如何优化数据库查询性能?

Java中如何优化数据库查询性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何优化数据库查询性能,这是提升应用程序响应速度和用户体验的关键技术。 优化数据库查询性能的重要性 在现代应用开发中,数据库查询是最常见的操作之一。随着数据量的增加和业务复杂度的提升,数据库查询的性能优化显得尤为重

局域网内vue2 配置本地IP地址访问项目

在日常开发中同事可能需要访问你的前端项目,可以通过配置实现通过ip访问 一.首先找到config文件夹目录下的 index.js文件             将此处的host的值修改为0.0.0.0(即 host: 0.0.0.0) // Various Dev Server settings//host: 'localhost' //将localhost进行替换成 0.0.0.0host:

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

Excel实用技巧——二级下拉菜单、数据验证

EXCEL系列文章目录   Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需要简单及时的数据分析项目前,Excel是完胜python、R、SPSS这些科学专业的软件的。因此决心开启Excel篇章。 数据分析为什么要学Excel Excel图表