为什么read()比getc()慢

Nat*_*Kup -4 c c++ unix linux

为什么syscall 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()系统调用,为什么慢?

Jan*_*dec 13

read()涉及上下文切换到内核,这是相对较慢的.直接使用它并一次读取一个字节时,您有许多上下文切换.但是当你使用getc()它时,它将调用read()一次4或8 kB而不是从中返回字符而不进行进一步的上下文切换,直到它耗尽缓冲区.

如果使用read()较大的缓冲区,则速度会快getc(),因为标准C库的通用缓冲有一些开销.

(编辑)注意,对于所有常用的存储介质,只能读取512字节的块.所以无论如何都必须在内核中进行一些缓冲.并且因为内存以4096字节的页面分配,所以大多数系统(Linux肯定会)在每次请求物理存储时读取至少那么多.但是上下文切换也很昂贵,因此用户空间中的额外缓冲层仍然可以节省大量时间.这个缓冲在所有libc IO中使用,其中包括使用的所有内容FILE*(缓冲区是FILE结构的一部分),因此fread()read()小读取更快.