在项目开发中,难免遇到需要频繁存储数据的应用场景。在存储过程中,往往需要考虑文件的IO的性能,会不会对整个程序正常运行产生影响。通常在项目开始前,会对整个文件写入性能进行一个评估,对文件写入效率有个基本了解后,再进行程序设计。
如下为文件写入效率测试的代码,供大家参考:
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <signal.h>
int main_running_flag = 0;
static void main_exit_proc(int signal)
{
switch(signal)
{
case SIGINT:
{
main_running_flag = 0;
}break;
default:break;
}
}
static unsigned long long get_now_time()
{
unsigned long long time = 0;
struct timeval now_time;
gettimeofday(&now_time, NULL);
time = now_time.tv_sec;
time *= 1000*1000;
time += now_time.tv_usec;
return time;
}
int main(int argc, char *argv[])
{
if(argc != 2 || strlen(argv[1]) < 1 )
{
printf("please input write context in argv[1]!!\n");
return 0;
}
/*接收用户中断信息号,退出程序*/
signal(SIGINT, main_exit_proc);
FILE *fp = NULL;
fp = fopen("test_write.txt","a+");
if(fp)
{
char buff[1024]={0};
sprintf(buff,"%s\n",argv[1]);
int len = strlen(argv[1]);
unsigned long long last_write_time = get_now_time();
unsigned long long cur_write_time = 0;
unsigned long long file_size = 0;
unsigned long long offset_time = 0;
unsigned long long total_time = 0;
unsigned long long write_times = 0;
int show_size = 10;
main_running_flag = 1;
while(main_running_flag)
{
fwrite(argv[1],1,len,fp);
fflush(fp);
file_size += len;
cur_write_time = get_now_time();
offset_time = cur_write_time-last_write_time,
total_time += offset_time;
write_times++;
if(file_size / (1024*1024) == show_size )
{
printf("-- %d~%dM write total time:%llds%lldms%lldus, now_file_size = %lld\n",show_size-10, show_size,
total_time/(1000*1000), total_time%(1000*1000)/1000, total_time%1000 ,file_size);
show_size += 10;
total_time = 0;
write_times = 0;
}
last_write_time = cur_write_time;
}
fclose(fp);
}
return 0;
}
测试结果(测试环境:windows10 WSL子系统 Ubuntu18.04):
每次写入1个字符,每写入10M的数据约需要7s400多ms的时间。
每次写入3个字符,每写入10M的数据约需要2s500多ms的时间。
每次写入15个字符,每写入10M的数据约需要600多ms的时间。、
修改代码,每次写入5M数据。
测试结果如下:
写入文件大小至1340M左右时,每写入10M数据所需时间从2ms增加至约20ms。
写入文件大小至8230M左右时,每写入10M数据所需时间从20ms增加至约400+ms。
测试结论:
1. 写入相同大小的数据,写入的次数越多,耗时越多。
2. 同一个文件,写入的文件大小至某个临界值时,文件写入效率会急剧减慢,并不是随文件增大逐渐减慢。
由于不同硬件平台及系统架构的差异,如上结论仅供参考,应以程序实测为准。