当前位置: 首页 > news >正文

【C++项目】高并发内存池第七讲性能分析

目录

  • 1.测试代码
  • 2.代码介绍
  • 3.运行结结果

1.测试代码

#include"ConcurrentAlloc.h"
#include"ObjectPool.h"
#include"Common.h"
void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds)
{std::vector<std::thread> vthread(nworks);std::atomic<size_t> malloc_costtime(0);std::atomic<size_t> free_costtime(0);for (size_t k = 0; k < nworks; ++k){vthread[k] = std::thread([&, k]() {std::vector<void*> v;v.reserve(ntimes);for (size_t j = 0; j < rounds; ++j){size_t begin1 = clock();for (size_t i = 0; i < ntimes; i++){//v.push_back(malloc(16));v.push_back(malloc((16 + i) % 8192 + 1));}size_t end1 = clock();size_t begin2 = clock();for (size_t i = 0; i < ntimes; i++){free(v[i]);}size_t end2 = clock();v.clear();malloc_costtime += (end1 - begin1);free_costtime += (end2 - begin2);}});}for (auto& t : vthread){t.join();}printf("%u个线程并发执行%u轮次,每轮次malloc %u次: 花费:%u ms\n",nworks, rounds, ntimes, malloc_costtime.load());printf("%u个线程并发执行%u轮次,每轮次free %u次: 花费:%u ms\n",nworks, rounds, ntimes, free_costtime.load());printf("%u个线程并发malloc&free %u次,总计花费:%u ms\n",nworks, nworks * rounds * ntimes, malloc_costtime.load() + free_costtime.load());
}
// 单轮次申请释放次数 线程数 轮次
void BenchmarkConcurrentMalloc(size_t ntimes, size_t nworks, size_t rounds)
{std::vector<std::thread> vthread(nworks);std::atomic<size_t> malloc_costtime(0);std::atomic<size_t> free_costtime (0);for (size_t k = 0; k < nworks; ++k){vthread[k] = std::thread([&]() {std::vector<void*> v;v.reserve(ntimes);for (size_t j = 0; j < rounds; ++j){size_t begin1 = clock();for (size_t i = 0; i < ntimes; i++){//v.push_back(ConcurrentAlloc(16));v.push_back(ConcurrentAlloc((16 + i) % 8192 + 1));}size_t end1 = clock();size_t begin2 = clock();for (size_t i = 0; i < ntimes; i++){ConcurrentFree(v[i]);}size_t end2 = clock();v.clear();malloc_costtime += (end1 - begin1);free_costtime += (end2 - begin2);}});}for (auto& t : vthread){t.join();}printf("%u个线程并发执行%u轮次,每轮次concurrent alloc %u次: 花费:%u ms\n",nworks, rounds, ntimes, malloc_costtime.load());printf("%u个线程并发执行%u轮次,每轮次concurrent dealloc %u次: 花费:%u ms\n",nworks, rounds, ntimes, free_costtime.load());printf("%u个线程并发concurrent alloc&dealloc %u次,总计花费:%u ms\n",nworks, nworks * rounds * ntimes, malloc_costtime.load() + free_costtime.load());
}
int main()
{size_t n = 10000;cout << "==========================================================" << endl;BenchmarkConcurrentMalloc(n, 4, 10);cout << endl << endl;BenchmarkMalloc(n, 4, 10);cout << "==========================================================" << endl;return 0;
}

2.代码介绍

这段代码是一个 C++ 程序,主要用于比较并评估使用不同内存分配和释放方式的性能。它包括了两个主要函数 BenchmarkConcurrentMalloc 和 BenchmarkMalloc 以及 main 函数来执行这些性能测试。以下是对这些函数的介绍:

  1. BenchmarkConcurrentMalloc 函数

这个函数用于执行并比较使用并发内存分配(ConcurrentAlloc 和 ConcurrentFree)的性能。
它创建了一定数量的线程,每个线程会执行一定轮次的内存分配和释放操作。
在每轮次内,每个线程将执行 ntimes 次内存分配和释放。
内存分配操作使用 ConcurrentAlloc 函数,它模拟了并发内存分配器,而内存释放操作使用 ConcurrentFree 函数。
函数会测量并累积每个线程的内存分配和释放的时间开销,并打印出这些结果,包括每轮的分配和释放时间以及总时间。
2. BenchmarkMalloc 函数

这个函数用于执行并比较使用传统的 malloc 和 free 函数的性能。
它也创建了一定数量的线程,每个线程会执行一定轮次的内存分配和释放操作,与 BenchmarkConcurrentMalloc 函数类似。
内存分配操作使用标准的 malloc 函数,而内存释放操作使用 free 函数。
函数同样测量并累积每个线程的内存分配和释放的时间开销,并打印出这些结果,包括每轮的分配和释放时间以及总时间。
3. main 函数

main 函数是程序的入口点。
它首先设置了一些测试参数,如 n(每轮次内存分配次数)、线程数量(nworks)、轮次数量(rounds)。
然后,它调用 BenchmarkConcurrentMalloc 函数和 BenchmarkMalloc 函数来进行性能测试。
最后,它打印出并比较了使用并发内存分配和传统内存分配方式的性能结果。
总的来说,这段代码用于比较并评估使用不同内存分配方式的性能,主要涉及并发内存分配和传统内存分配方式,并通过多线程的方式来模拟并测量性能。

3.运行结结果

0
在这里插入图片描述

http://www.lryc.cn/news/209309.html

相关文章:

  • 【JavaScript】快速学习JS
  • 控制输入流,从控制台打印到文件中,更改输出的位置
  • 计算线阵相机 到 拍摄产品之间 摆放距离?(隐含条件:保证图像不变形)
  • 【网络】详解http协议
  • 1819_ChibiOS的互斥信号与条件变量
  • CSDN学院 < 华为战略方法论进阶课 > 正式上线!
  • 电商接口api数据比价接口推荐
  • 读取Excel的工具类——ExcelKit
  • vscode连接服务器一直retry
  • Spring Cloud Sentinel整合Nacos实现配置持久化
  • STM32F4VGT6-DISCOVERY:uart1驱动
  • C语言之 结构体,枚举,联合
  • 红米电脑硬盘剪切
  • 微信小程序在线预览PDF文件
  • Android 工厂模式增加Type-A功能测试
  • Web攻防06_sqlmap的使用
  • C++模拟实现-----日期计算器(超详细解析,小白一看就会!)
  • Oracle实现把B表某一字段更新到A表
  • CUMCM历年赛题汇总
  • 人间道-您到底做错了什么:正心径之您要逐渐去除外邪行为
  • Spring Boot拓展XML格式的请求和响应
  • 0045【Edabit ★☆☆☆☆☆】【字符数转整型】Return a String as an Integer
  • 数据库MySQL(六):事务
  • 比较浮点数时,我被绊倒了
  • JVM进阶(1)
  • 【AICFD案例操作】汽车外气动分析
  • Hadoop 请求数据长度 Requested Data length 超过配置的最大值
  • 搜索与图论:染色法判定二分图
  • 磁场设备主要有哪些
  • 【wespeaker】模型ECAPA_TDNN介绍