程序对于堆内存的自动管理分为CPP一类的自动引用计数和Java的GC。Android app有时卡顿一下,因为程序在集中释放堆。如果把自动释放堆放到其他线程中,程序运行效率是否进一步提高?
//
// main.c
// AsynchronousRelease
//
// Created by 孙树港 on 2024/1/4.
//
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
#define size 1024*1024
int *p[500];
void myfunc()
{
for (int i = 0; i < 500; i++) {
free(p[I]);
}
return ;
}
int main(int argc, const char * argv[]) {
// insert code here...
clock_t begin,end;
begin=clock();
pthread_t th1;
//循环堆内存分配和释放
for (int i = 0; i < 500; i++) {
int *num = NULL;
num = (int *) malloc(size);
memset(num, '*', size);
p[i]= num;
//puts("do something ");
//free(num);
}
//myfunc();
pthread_create(&th1, NULL, myfunc, NULL);
end=clock();
printf("%lf\n",(double)(end-begin)/CLOCKS_PER_SEC);
printf("Main Function Over!\n");
return 0;
}
把malloc的地址存放到指针数组中。然后集中进行释放。当在主线程调用myfunc函数与异步调用程序快了0.1。无论是自动引用计数还是java GC机制,原理类似,使用一个容器存放指针,在合适的时机集中释放。
本程序,同样进行集中释放,只不过不影响主线程。
image.png image.png
网友评论