stat()
系统调用真的很贵吗?我在某处读到这是一个昂贵的系统调用。是真的吗?如果有,还有其他选择吗?
答案 0 :(得分:19)
在典型设置中,stat(2)
,fstat(2)
和lstat(2)
是获取文件信息的唯一合理技术。如果您发现性能问题,那么分析您的应用程序并查看会发生什么是值得的。
要进行分析,请使用gcc -pg
进行编译,然后使用gprof(1)
运行可执行文件。
您可能会切换到使用像Qt这样的更大的库,但这不会处理任何性能问题,并且无论如何它们都可能使用stat(2)
。
因此,无论是否昂贵,都没有合理的选择。
也就是说,就像Jim Mcnamara的评论一样,正是由于这些原因,它并不昂贵。由于没有其他选择,glibc和linux程序员已尽可能提高性能。
答案 1 :(得分:6)
您始终可以将strace
用于可执行文件。没有必要重新编译。此功能允许您获取每个系统调用的实际执行时间。
答案 2 :(得分:3)
问题出现为“需要昂贵的v / s”。
Unix上的每个进程都以两种模式运行:“用户空间”和“内核空间”,当系统调用如open(),write(),stat()时,进程从用户空间转换到内核模式很昂贵,但只有当我们没有对这个系统调用做任何有意义的事情时。如果你使用stat()只打印文件的最后访问时间而我们正在做什么,那么可能我应该避免。
首先,应该有一个很好的理由来调用stat()。 其次,如果您想比较不同代码段的相对执行时间,请使用任何分析工具,它将为您提供确切的统计信息,以证明哪个函数调用很昂贵,哪个不是。
答案 3 :(得分:0)
是的,与许多其他内核提供的函数调用和操作相比,stat()使用了很长时间。
但是,没有多少选择。如果你是绝望的,可以修补Linux内核以缓存对stat()的所有调用的结果,然后在每次创建,删除和相关修改时更新stat缓存。这是很多工作要实现,但应该加快统计数据。