1 Star 2 Fork 3

ZeroTwo/内存池

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
main.c 4.73 KB
一键复制 编辑 原始数据 按行查看 历史
ZeroTwo 提交于 2022-12-07 19:32 . 新增块总数读取函数
#include <stdio.h>
#include <time.h>
#include "MemPool.h"
void printMemPoolMsg(void);//打印池信息
void printAreaMsg(void);//打印内存池分区信息
void testMallocAndFree(void);//测试分配与释放
double testMemPool_10000_Time(void);//测试对比内存池与malloc重复分配与释放的性能
double testMalloc_10000_Time(void);//测试对比内存池与malloc重复分配与释放的性能
int main(void)
{
double mallocTime, MemPoolTimer;
MP_setMemPool(0, 0);//设置内存池,因为使用的是模式3,地址与大小不会被采用可随便填写
for (MP_uintx_t i = 0; (8 * i + 8) <= 512; i++) {
MP_addArea((8+ 8 * i), (4096 / (8 + 8 * i)));//创建分区,分区包含(4096 / (8 + 8 * i))个(8+ 8 * i)字节分配块
}
MP_initMemPool();//初始内存池
printf("-------------------\n");
printf("池初始化成功\n");
printMemPoolMsg();
/*----测试----*/
testMallocAndFree();
mallocTime = testMalloc_10000_Time();
MemPoolTimer = testMemPool_10000_Time();
printf("在10000次的循环100次申请100次释放中,内存池的效率是malloc的 %.3lf%%\n\n", (mallocTime / MemPoolTimer) * 100.00);
/*----END----*/
printMemPoolMsg();
printAreaMsg();
while (1);
return 0;
}
//测试对比内存池与malloc重复分配与释放的性能
double testMemPool_10000_Time(void)
{
void* arrAddr[100];
int i;
unsigned int j;
clock_t startTime, endTime;
j = 10000;
startTime = clock();
while (j--)
{
for (i = 0; i < 100; i++) {
arrAddr[i] = MP_malloc(4);
if (arrAddr[i] == MP_NULL)break;
}
for (i = 100-1; i >= 0; i--) {
MP_free(arrAddr[i]);
}
}
endTime = clock();
printf("内存池:10000次循环100次申请100次释放需要时间 = %.3lfs\n", (double)(((double)endTime - (double)startTime) / CLOCKS_PER_SEC));
return (double)(((double)endTime - (double)startTime) / CLOCKS_PER_SEC);
}
//测试对比内存池与malloc重复分配与释放的性能
double testMalloc_10000_Time(void)
{
void* arrAddr[100];
int i;
unsigned int j;
clock_t startTime, endTime;
j = 10000;
startTime = clock();
while (j--)
{
for (i = 0; i < 100; i++) {
arrAddr[i] = malloc(4);
if (arrAddr[i] == MP_NULL)break;
}
for (i = 100-1; i >= 0; i--) {
free(arrAddr[i]);
}
}
endTime = clock();
printf("malloc:10000次循环100次申请100次释放需要时间 = %.3lfs\n", (double)(((double)endTime - (double)startTime) / CLOCKS_PER_SEC));
return (double)(((double)endTime - (double)startTime) / CLOCKS_PER_SEC);
}
//测试分配与释放
void testMallocAndFree(void)
{
void* arrAddr[20];
int* p;
printf("-------------------\n");
/*申请20个空间的地址*/
for (int i = 0; i < 20; i++) {
arrAddr[i] = MP_malloc(4);
printf("|1.%d-申请到空间地址为:%p\n",i, arrAddr[i]);
if (arrAddr[i] == MP_NULL)break;
}
/*释放20个空间的地址*/
for (int i = 19; i >= 0; i--) {
if (MP_free(arrAddr[i]) == MP_ERR)printf("|1.%d-释放失败:%p\n", i, arrAddr[i]);
}
printf("|-------------------\n");
printMemPoolMsg();
/*申请20个空间的地址*/
for (int i = 0; i < 20; i++) {
arrAddr[i] = MP_malloc(4);
printf("|2.%d-申请到空间地址为:%p\n", i, arrAddr[i]);
if (arrAddr[i] == MP_NULL)break;
}
/*释放20个空间的地址*/
for (int i = 19; i >= 0; i--) {
if (MP_free(arrAddr[i]) == MP_ERR)printf("|1.%d-释放失败:%p\n", i, arrAddr[i]);
}
printf("-------------------\n");
/*重复释放测试*/
p = MP_malloc(4);
if (MP_free(p) == MP_ERR)printf("****----重复释放!----****\n");
printMemPoolMsg();
p = MP_malloc(4);
printMemPoolMsg();
if (MP_free(p) == MP_ERR)printf("****----重复释放!----****\n");
if (MP_free(p) == MP_ERR)printf("****----重复释放!----****\n");
printMemPoolMsg();
p = MP_malloc(100);
if (p == MP_NULL)printf("分配失败!\n");
}
//打印内存池分区信息
void printAreaMsg(void)
{
int number = MP_readAreaNumber();
printf("|--------------内存池区信息信息-------------BEGIN-|\n");
printf("|内存池共有 %d个区\n", number);
printf("|内存池共有 %d个块\n", MP_readBlockNumber());
for (int i = 1; i <= number; i++)
{
AreaTypedef Area = MP_readAreaMsg(i);
printf("|------------------------------------\n");
printf("|区 %d:基地址:0x%X\n", i, Area.Addr_Base);
printf("|区 %d:总存储块个数 = %d\n", i, Area.Total_Count);
printf("|区 %d:已使用的存储块个数 = %d\n", i, Area.Used_Count);
printf("|区 %d:存储块大小(区类型) = %d\n", i, Area.Block_Size);
printf("|区 %d:使用百分比:%.2f%%\n", i,((float)Area.Used_Count / (float)Area.Total_Count) * 100.00);
}
printf("|--------------内存池区信息信息---------------END-|\n");
}
//打印池信息
void printMemPoolMsg(void)
{
printf("|--------------内存池信息-------------------BEGIN-|\n");
printf("|内存池ID:%d\n", MP.ID);
printf("|内存池基地址:0x%X\n", MP.Addr_Base);
printf("|内存池管理系统占用大小:%d Byte\n", MP.PoolSys_Size);
printf("|内存池已被使用的内存大小:%d Byte\n", MP.Used_Size);
printf("|内存池总大小:%d Byte\n", MP.Pool_Size);
printf("|内存池使用百分比:%.2f%%\n", ((float)MP.Used_Size / (float)MP.Pool_Size) * 100.00);
printf("|---------------------------------------------END-|\n");
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/wjw02/MemPool.git
[email protected]:wjw02/MemPool.git
wjw02
MemPool
内存池
master

搜索帮助