vectorint::push_back 与直接访问性能对比

news/2024/11/15 22:18:47/文章来源:https://www.cnblogs.com/caijianhong/p/18548753

vector 是提前开好空间然后每次 clear,vector2 是 reserve,list 就是 list,array 是对 vector vec[cur++] = i;。这里都是整数,push_back 与 emplace_back 整体没有什么区别,但有人要看,所以函数名前面加了 e 的是 emplace_back。

测试结果:array < vector = vector2 << list

2024-11-15T22:10:51+08:00
Running ./push_back
Run on (8 X 2419.2 MHz CPU s)
CPU Caches:L1 Data 48 KiB (x4)L1 Instruction 32 KiB (x4)L2 Unified 1280 KiB (x4)L3 Unified 8192 KiB (x1)
Load Average: 0.08, 0.02, 0.01
-----------------------------------------------------------------
Benchmark                       Time             CPU   Iterations
-----------------------------------------------------------------
bench_evector/100            59.5 ns         59.5 ns     12706596
bench_evector/1000            538 ns          538 ns      1260305
bench_evector/10000          5438 ns         5438 ns       131222
bench_evector/100000        82071 ns        82071 ns         8507
bench_evector/1000000      868177 ns       868180 ns          817
bench_evector2/100           73.6 ns         73.6 ns      9367293
bench_evector2/1000           536 ns          536 ns      1290501
bench_evector2/10000         5057 ns         5057 ns       137541
bench_evector2/100000       81939 ns        81939 ns         8573
bench_evector2/1000000     860870 ns       860872 ns          816
bench_elist/100              1240 ns         1240 ns       558806
bench_elist/1000            12513 ns        12513 ns        53484
bench_elist/10000          126142 ns       126143 ns         5498
bench_elist/100000        1302104 ns      1302107 ns          537
bench_elist/1000000      14266316 ns     14266308 ns           48
bench_vector/100             55.7 ns         55.7 ns     12734427
bench_vector/1000             536 ns          536 ns      1282267
bench_vector/10000           5360 ns         5360 ns       129287
bench_vector/100000         81479 ns        81479 ns         8613
bench_vector/1000000       878694 ns       878296 ns          806
bench_vector2/100            74.0 ns         74.0 ns      9416006
bench_vector2/1000            542 ns          542 ns      1286119
bench_vector2/10000          5053 ns         5053 ns       134027
bench_vector2/100000        81568 ns        81567 ns         8460
bench_vector2/1000000      852110 ns       852105 ns          803
bench_list/100               1291 ns         1291 ns       552344
bench_list/1000             12544 ns        12544 ns        56783
bench_list/10000           128511 ns       128511 ns         5560
bench_list/100000         1300553 ns      1300559 ns          549
bench_list/1000000       14576666 ns     14576566 ns           47
bench_array/100              35.2 ns         35.2 ns     19917275
bench_array/1000              300 ns          300 ns      2356720
bench_array/10000            2961 ns         2961 ns       237905
bench_array/100000          29223 ns        29198 ns        25397
bench_array/1000000        324843 ns       324845 ns         2077

测试代码:

#include <benchmark/benchmark.h>
#include <bits/stdc++.h>
using namespace std;
void bench_evector2(benchmark::State& state) {int n = state.range(0);for (auto _: state) {vector<int> vec;vec.reserve(n);for (int i = 0; i < n; i++) vec.emplace_back(i);}
}
void bench_elist(benchmark::State& state) {int n = state.range(0);for (auto _: state) {list<int> vec;for (int i = 0; i < n; i++) vec.emplace_back(i);}
}
void bench_evector(benchmark::State& state) {int n = state.range(0);vector<int> vec(n);for (auto _: state) {vec.clear();for (int i = 0; i < n; i++) vec.emplace_back(i);}
}
void bench_vector2(benchmark::State& state) {int n = state.range(0);for (auto _: state) {vector<int> vec;vec.reserve(n);for (int i = 0; i < n; i++) vec.push_back(i);}
}
void bench_list(benchmark::State& state) {int n = state.range(0);for (auto _: state) {list<int> vec;for (int i = 0; i < n; i++) vec.push_back(i);}
}
void bench_vector(benchmark::State& state) {int n = state.range(0);vector<int> vec(n);for (auto _: state) {vec.clear();for (int i = 0; i < n; i++) vec.push_back(i);}
}
void bench_array(benchmark::State& state) {int n = state.range(0);vector<int> vec(n);for (auto _: state) {int cur = 0;for (int i = 0; i < n; i++) vec[cur++] = i;}
}
#define generate_test(name) BENCHMARK(bench_##name)->RangeMultiplier(10)->Range(100, 1000000);
generate_test(evector);
generate_test(evector2);
generate_test(elist);
generate_test(vector);
generate_test(vector2);
generate_test(list);
generate_test(array);
BENCHMARK_MAIN();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Latex 安装

使用的开发环境是 VSCode. Latex 在编译时需要用到宏包. 宏包到底是啥? 有啥作用? 从何处下载? Latex 软件的安装:texlive: 一次性下载所有的宏包. 磁盘需求较大, 约 7 ~ 8 G.miktex: 仅下载必要的宏包, 编译时补充下载宏包. 磁盘需求较小, 约几百 M.清华大学开源软件镜像站…

20222424 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20222424 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1.实验内容 (1)从www.besti.edu.cn、baidu.com、sina.com.cn中选择一个DNS域名进行查询,获取如下信息:DNS注册人及联系方式 该域名对应IP地址 IP地址注册人及联系方式 IP地址所在国家、城市和具体地理位置 PS:…

Windows程序设计指南

Windows程序设计指南“到Petzold的书中找找”——仍然是解决Windows程式开发各种疑难杂症时的灵丹妙药。在第五版的《Windows程式开发设计指南》中,作者身为倍受敬重的WindowsPioneerAward(Windows开路先锋奖)得主,依据最新版本Windows作业系统,以可靠的取材资料校定这一本…

Windows高级调试

Windows高级调试中文版文档摘要: 本书《Windows高级调试》主要讲解Windows高级调试技术和工具,包括调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、64位调试、事后调试、Windows Vista基础…

iman——冲刺日志(第四天)

又一阉割版 团队成员分工与进度 📝👥组别 成员 完成的任务 完成任务所用时间 (小时) 剩余时间 (小时)前端 阿依娜孜 完成了行程概览地图中标记连线与探索功能的删除与添加。 3 2前端 郭剑敏 实现了地图标点的驾车路线绘制功能。 3 1前端 王梓铭 优化了主页与导航栏布局,提…

1.11--06:月度开销

http://noi.openjudge.cn/ch0111/06/月度开销题目传送门思路 给定连续N天的开销,需要将这些天分成M个财政周期,使得开销最多的财政周期的开销尽可能少。 首先,我们可以确定一个财政周期的长度l,即将N天平均分成M个财政周期。这样每个财政周期的长度就是N/M。 然后,我们需要…

SIM Jacker攻击分析

攻击者使用普通手机发送特殊构造的短信即可远程定位目标,危害较大。sim卡的使用在手机上的使用非常普遍,所以一旦SIM卡上出现什么问题就会造成非常大的影响。在19年的报告纰漏中,在全球估算共有10亿设备的sim卡容易遭受SIMJacker攻击,这篇也是比较浅显的对整个攻击进行分析…

shell动态修改yml配置实例

yq安装https://github.com/mikefarah/yq/tree/master每个yq版本支持的选项参数都不一样修改Dockerfile[root@instance base-tlog-test]# vi Dockerfile FROM 192.168.30.113/library/java:latest ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &am…

『模拟赛』NOIP2024加赛5

Rank 反向挂分大王A. 暴力操作(opt) 签,但是没有人签。 都想到了二分和更新 c 值,但是 c 多多少少没更到最优。 首先还是调和级数预处理,倒序取 min。然后考虑到超过 \(m\) 的也有可能产生更小的代价,因此 \(\mathcal{O(n)}\) 枚举一遍找到最小的 \(j\) 使 \(i\times j\g…

[Moectf2024 ezMaze]

去壳 分析:迷宫分析10 * a2 - 10:Y (a1 - 1) / 8 :X 表示按字节处理迷宫迷宫以十六进制压缩,但迷宫是80 * 56的二进制迷宫 dump下来保存,转二进制,用bin(maze[2:]).zfill(8) 脚本(bfs): from collections import deque maze = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…

有理逼近AAA算法

用于有理逼近的AAA算法,可以有效防止伪极点现象用于有理逼近的AAA算法The AAA Algorithm for Rational Approximation, Yuji Nakatsukasa, Olivier Ste, and Lloyd N. Trefethen, SIAM Journal on Scientific Computing 2018 40:3, A1494-A1522, https://doi.org/10.1137/16M1…

Hgame2023 Reverse

Hgame 2023 [HGAME 2023 week1]test your IDA 用ida打开即可 [HGAME 2023 week1]encode 查壳 32位windows 加密函数将输入的字节转高位和低位进行加密,后与byte_403000进行比较 解密脚本: 这里采取了爆破 enc = [8, 6, 7, 6, 1, 6, 13, 6, 5, 6, 11, 7, 5, 6, 14, 6, 3, 6, 1…