Syscall开销

Car*_*s00 6 c c++ linux gcc

Linux上C程序的I/O系统调用开销有多大(我)是指read / writeread / write大型缓冲区(常规文件或网络套接字)相比,运行有多糟糕?应用程序是强多线程的.

R..*_*R.. 15

Syscalls在大多数现代机器上至少需要1-2微秒,仅用于系统调用开销,如果他们做任何可能阻塞或睡眠的复杂事件,则需要更多时间.预计IO至少需要20微秒,最高可达毫秒级.比较一个微小的函数调用或宏从用户空间缓冲区读取一个字节,这可能在几纳秒内完成(在糟糕的一天可能是200 ns).

  • +1,感谢您不要像许多人那样对性能问题充满神秘和虚无主义. (6认同)
  • @Zan:如果你需要关闭所有文件描述符但又不想浪费那么多时间在每个可能的文件上尝试`close`这是一个非常酷的技巧:`poll`接口可以探测任意长的文件描述符列表和告诉你哪些是有效的,哪些不是有效的,只需一个系统调用.然后你只需要'关闭'确定的`poll`是有效的. (5认同)
  • @Gabe:2004年,我加速了gnome-terminal启动从一秒钟到100毫秒以下,只是消除了它所做的4096个close()系统调用.事实上,在启动器的fork/exec和程序启动之间,它们执行了两次.我的补丁没有被接受,他们最终做了一些有点发烧友的事情. (3认同)
  • @Gabe:这并不是那么简单,至少在所有情况下都不是这样.为了执行实际的IO,工作成本相当昂贵,但是对于多路复用IO(`select`),定时(`nanosleep`),信号控制(`sigprocmask`),同步对象(`futex`)以及许多其他情况,总体时间实际上由系统调用开销主导,而不是由任何工作完成.实际上,出于许多目的,来自系统调用开销的常数因素是如此之大,以至于在计算时间成本如何与实际大小数据进行扩展时,只计算系统调用(即考虑其他所有其他的"O(0)")是切实可行的. (2认同)
  • 仅Linux的方法也慢得多(许多系统调用,包括`/ proc`上的IO,这是非常慢的,而不仅仅是一个). (2认同)