为什么read比getc慢?
例如,这是:
for (;;) {
chr++;
amr=read(file1, &wc1, 1);
amr2=read(file2, &wc2, 1);
if (wc1 == wc2) {
if (wc1 == '\n')
line++;
if (amr == 0) {
if (eflg)
return (1);
return (0);
}
continue;
}比这慢:
for (;;) {
chr++;
c1 = getc(file1);
c2 = getc(file2);
if (c1 == c2) {
if (c1 == '\n')
line++;
if (c1 == EOF) {
if (eflg)
return (1);
return (0);
}
continue;
}getc使用read系统调用,那么为什么它要慢一些呢?
发布于 2013-04-22 11:20:43
因为getc()在返回数据之前会缓冲读取的数据,所以对getc()的调用不一定会导致对read()的调用。read()是一个系统调用,因为内核有更多的操作要做,所以完成它比普通函数调用花费的时间要长得多。当您进入内核空间时,它会更改您的堆栈,保存所有上下文,处理屏蔽的中断,而在另一端,当它完成时,它将恢复上下文、中断,将您的用户空间堆栈放回.这就是为什么首选getc(),因为如果您已经拥有可用的缓冲数据,那么它可以节省重要的开销。
发布于 2013-04-22 13:46:27
实际上,从磁盘读取数据是面向块的:要从磁盘读取单个字节,硬件最终读取一个字节(512或1024或一些字节),缓冲所有字节,将其传递给内核。如果从文件的块0读取文件的字节0,做一些工作,然后从文件中读取字节1,内核可能会再次读取文件的块0。是的,在内核和磁盘驱动器本身中都有缓存的潜力,但是内核处理了很多进程,所以可能不会。
每个read()调用还必须将CPU从用户状态更改为内核状态。内存映射至少会改变。可能还有很多不太明显的事情发生了。这也需要时间。
read()系统调用会改变CPU状态,并可能导致磁盘I/O。getc()可以在用户空间中缓冲整个磁盘块(或更多),因此,对getc()的调用可能会导致内核在单个磁盘块中读取,只需进行一次状态更改。如果您查看stdio.h,您将发现一个常量BUFSIZ的宏,该宏对于read()或磁盘上的文件的write()系统调用来说应该是一个有效的(磁盘块多个)大小。
https://unix.stackexchange.com/questions/73264
复制相似问题