我想将一个文件的内容复制到另一个文件。
[起初我以为fgetc()
会比setbuf()
更好,因为该程序无需为了复制每个字符而重复通过缓冲区。
但是我很快意识到,重复使用fgetc()
等效于执行多个函数(堆栈指针),这样,如果文件很大,它将使过程更加耗时。
[fgetc(FILE*):
((推FILE*
的值)+(返回存储在char
中的值])+(包含文件char*
指针)* SIZE + ...
setbuf(FILE*,char*):
(将FILE*
和char*
的值推入)+(mov char
,filechar
)+(而char!=-1获取下一个字符)+将char设置为0返回[C0 ]
哪个更有效?
filechar*
的问题是现代C实现支持threads。 fgetc
可以由多个线程共享,这就是为什么访问缓冲区需要显式锁定的原因。虽然您可以使用FILE
来扩大缓冲区,但并不能消除锁定的必要。因此,setbuf
调用几乎总是比多个fread
调用性能更高。
任何fgetc
设置只能对性能有很大影响。要一次从缓冲流中读取单个字符,可以在文件被线程锁定时使用POSIX标准setbuf
/ flockfile
和funlockfile
。