?1、当系统调用被执行时,需要从用户态切换到内核态,执行完毕后再从内核态切换到用户态,频繁的切换就会导致性能损失。 ?2、标准IO在内部维护一个缓冲区,只有在满足特定条件才会把缓冲区与内核同步,因此降低了系统调用的使用频率,减少用户太和内核态的来回切换次数,因此速度比系统IO要快。 ?3、如果想提高系统IO的速度,可以尝试维护一个更大的缓冲区,这样它会比标准IO更快。 ?4、系统IO中没文本文件读写的函数,可以配合缓冲区+ssanf/sprintf来实现。 ? ? 注意:普通情况建议使用标准IO(比直接使用系统IO要快),如果对速度有很高的要求,可以使用系统IO+大缓冲区。
#include <getch.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc,const char* argv[])
{
if(3 != argc)
{
puts("Use: cp src dest");
return 0;
}
int src_fd = open(argv[1],O_RDONLY);
if(0 > src_fd)
{
printf("%s 文件不存在,请检查!\n",argv[1]);
return 0;
}
int dest_fd = open(argv[2],O_WRONLY|O_CREAT|O_EXCL,0644);
if(0 > dest_fd)
{
printf("目标文件%s已经存在,是否覆盖(y/n)?",argv[2]);
char cmd = getch();
if(cmd != 'y' && cmd != 'Y')
{
close(src_fd);
return 0;
}
printf("%c\n",cmd);
dest_fd = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644);
}
int ret;
char buf[4096];
while(ret=read(src_fd,buf,sizeof(buf)))
{
write(dest_fd,buf,ret);
}
close(src_fd);
close(dest_fd);
}
|