分别使用标准IO与系统IO随机写入1000000个整数到文件,比较哪种更快,为什么?
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* fwp = fopen("std.bin","w");
for(int i=0; i<1000000; i++)
{
int num = rand() % 10000;
fwrite(&num,4,1,fwp);
}
fclose(fwp);
}
real 0m0.113s 标准IO
user 0m0.100s
sys 0m0.008s
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
int fd = open("test1.bin",O_WRONLY|O_CREAT,0644);
if(0>fd)
{
perror("open");
return -1;
}
for(int i=0;i<1000000;i++)
{
int num= rand()%10000;
write(fd,&num,4);
}
close(fd);
}
real 0m2.845s 系统IO
user 0m0.268s
sys 0m2.572s
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
int main()
{
int fd = open("sys.bin",O_WRONLY|O_CREAT,0644);
if(0 > fd)
{
perror("open");
return -1;
}
int arr[8192] = {} , i;
for(i=0; i<1000000; i++)
{
arr[i%8192] = rand() % 10000;
if(0 == i % 8192)
write(fd,&arr,4*8192);
}
write(fd,&arr,(i%8192)*4);
close(fd);
}
real 0m0.064s 设置过缓冲区的系统IO
user 0m0.060s
sys 0m0.000s
因为标准IO使用了缓冲技术,当数据写入时并没有立即把数据交给内核,而是先存放在缓冲区中,当缓冲区满时,会一次性把缓冲中的数据交给内核写到文件中,这样就减少内核态与用户态的切换次数。
而系统IO每写一次数据就要进入一次内核态,这样就浪费了大量时间进行内核态与用户态的切换,因此用时更长。
如果为系统IO,设置更大的缓冲区,它会比标准IO更快。