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

Ale*_*ern 2 linux c

为什么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;
        }
Run Code Online (Sandbox Code Playgroud)

比这慢:

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;
    }
Run Code Online (Sandbox Code Playgroud)

getc使用read系统调用,为什么它更慢?

Kot*_*tte 11

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