代码之家  ›  专栏  ›  技术社区  ›  Trey Jackson

times()系统调用的开销-相对于文件操作

  •  0
  • Trey Jackson  · 技术社区  · 14 年前

    打电话的相对开销是多少 times() 与文件操作(如读取行)相比 fread() .

    我意识到这可能不同于OS和OS,这取决于行的长度、文件所在的位置、是否确实是一个阻塞的管道(它不是)等。

    很可能文件不是本地文件,而是安装在本地网络上某个位置的NFS驱动器上。常见的情况是一行20个字符长。如果有帮助,假设Linux内核2.6.9。代码将 在Windows上运行。

    我只是在找一个粗略的向导。它是在同一个数量级上吗?更快?更慢的?

    最终目标:我正在考虑实现一个进度回调例程,但不想过于频繁地调用(因为回调可能非常昂贵)。大部分的工作是阅读文本文件(逐行),并对其进行一些处理。不幸的是,有些线路 非常 很长,所以简单的打电话给 N 在常见的病理病例中,直线治疗无效。

    我之所以避免编写基准测试,是因为我害怕编写错误,并且希望人群的智慧大于我未完成的测试。

    3 回复  |  直到 14 年前
        1
  •  2
  •   miedwar    14 年前

    在Linux上,您可以编写一个小程序,对times()和fread()执行大量调用,并使用strace-c测量系统调用时间。

    例如

    for (i = 0; i < RUNS; i++) {
            times(&t_buf);
            fread(buf,1,BUF,fh);
    }
    

    这是buf 4096的时候(fread每次都会调用read())

    # strace -c ./time_times
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     59.77    0.001988           0    100000           read
     40.23    0.001338           0     99999           times
    

    这是16岁的时候

    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
     99.00    0.001387           0     99999           times
      1.00    0.000014           0       392           read
    
        2
  •  3
  •   Artelius    14 年前

    fread() 是C库函数,而不是系统调用。 Frad() , fwrite() , fgets() 默认情况下,所有朋友都是缓冲I/O(请参见 setbuf )这意味着库分配了一个缓冲区,该缓冲区降低了 read() write() 需要进行系统调用。

    这意味着,如果您按顺序从文件中读取数据,那么库将只发出一次系统调用,例如,100次读取(取决于缓冲区大小和一次读取的数据量)。

    读() 写() 但是,系统调用肯定比调用慢 times() 因为程序和内核之间需要交换的数据量很大。如果数据缓存在操作系统的缓冲区中(例如,几分钟前它是由同一台机器上的另一个进程写入的),那么它仍然会非常快。如果数据没有被缓存,那么您必须等待I/O(无论是到磁盘还是通过网络),相比之下,这是非常缓慢的。

    如果数据是通过NFS新获得的,那么我很有信心 时间() 会比 Frad() 平均而言。

        3
  •  1
  •   jim mcnamara    14 年前

    times()只读取内核维护的特定于进程的数据。数据由内核维护,以便在进程退出时为wait()系统调用提供信息。因此,无论是否调用times(),都始终维护数据。调用times()的额外开销非常低

    fread()、fwrite()等调用底层系统调用-read()&write(),调用驱动程序。然后驱动程序将数据放入内核缓冲区。在资源方面,这比调用times()要昂贵得多。

    这就是你要问的吗?