首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么read()比getc()慢?

为什么read()比getc()慢?
EN

Unix & Linux用户
提问于 2013-04-22 11:15:26
回答 2查看 1.6K关注 0票数 2

为什么readgetc慢?

例如,这是:

代码语言:javascript
复制
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;
        }

比这慢:

代码语言:javascript
复制
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系统调用,那么为什么它要慢一些呢?

EN

回答 2

Unix & Linux用户

发布于 2013-04-22 11:20:43

因为getc()在返回数据之前会缓冲读取的数据,所以对getc()的调用不一定会导致对read()的调用。read()是一个系统调用,因为内核有更多的操作要做,所以完成它比普通函数调用花费的时间要长得多。当您进入内核空间时,它会更改您的堆栈,保存所有上下文,处理屏蔽的中断,而在另一端,当它完成时,它将恢复上下文、中断,将您的用户空间堆栈放回.这就是为什么首选getc(),因为如果您已经拥有可用的缓冲数据,那么它可以节省重要的开销。

票数 10
EN

Unix & Linux用户

发布于 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()系统调用来说应该是一个有效的(磁盘块多个)大小。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/73264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档