问题描述:
- 分别使用标准IO与系统IO随机写入1000000个整数到文件,比较哪种更快。
标准I/O程序:
#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);
}
系统IO程序:
#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;
}
for(int i=0; i<1000000; i++)
{
int num = rand() % 10000;
write(fd,&num,4);
}
close(fd);
}
系统IO程序(设置了缓冲区):
#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);
}
运行时间比较:
标准I/O
real 0m0.164s
user 0m0.128s
sys 0m0.012s
系统I/O
real 0m2.797s
user 0m0.200s
sys 0m2.316s
系统I/O(设置了缓冲区)
real 0m0.079s
user 0m0.060s
sys 0m0.004s
结论:
- 因为标准IO使用了缓冲技术,当数据写入时并没有立即把数据交给内核,而是先存放在缓冲区中,当缓冲区满时,会一次性把缓冲中的数据交给内核写到文件中,这样就减少内核态与用户态的切换次数。
- 而系统IO每写一次数据就要进入一次内核态,这样就浪费了大量时间进行内核态与用户态的切换,因此用时更长。
- 如果为系统IO,设置更大的缓冲区,它会比标准IO更快。