在Linux上,access()比stat()更快吗?

在Linux上,access()比stat()更快吗?,第1张

概述在Linux上,access()比stat()更快吗?

我假设access()只是stat()的一个包装,但是我一直在用Googlesearch, 发现了一些关于用更便宜的访问调用取代stat调用的轶事 。 假设你只是想检查一个文件是否存在,访问速度更快? 它是完全不同的文件系统?

为什么我的性能计数器代码不起作用?

I / O性能完整性检查 – 检查文件是否存在

监视windows移动设备上每个线程的cpu使用情况

在非托pipe代码中创build和更新性能计数器有什么好的参考?

使用Visual Studio 2008时是否有人遇到缓慢?

理论

我不信。

在较低层的内核中, access()和stat()调用在执行查找 *** 作时没有太大区别:它们将文件名映射到dentry缓存中的一个入口和inode (它是实际的内核结构, inode )。 查找是慢 *** 作,因为你需要为路径的每个部分执行它,即/usr/bin/cat你将需要查找usr , bin ,然后cat ,它可以要求从磁盘读取 – 这就是为什么inode和dentrIEs被缓存在内存中。

这个调用之间的主要区别在于stat()将inode结构转换为stat结构,而access()将做一个简单的检查,但是这个时间比查找时间要小。

真正的性能增益可以通过像faccessat()和fstatat()这样的faccessat()来实现,它允许open()目录一次,只是比较:

struct stat s; stat("/usr/bin/cat",&s); // lookups usr,bin and cat = 3 stat("/usr/bin/less",bin and less = 3 int fd = open("/usr/bin"); // lookups usr,bin = 2 fstatat(fd,"cat",&s); // lookups cat = 1 fstatat(fd,"less",&s); // lookups less = 1

实验

我写了一个调用stat()和access()的小python脚本:

import os,time,random files = ['gzexe','catchsegv','gtroff','gencat','neqn','gzip','getent','sdiff','zcat','iconv','not_exists','ldd','unxz','zcmp','locale','xz','zdiff','localedef','xzcat'] access = lambda fn: os.access(fn,os.R_OK) for i in xrange(1,80000): try: random.choice((access,os.stat))("/usr/bin/" + random.choice(files)) except: continue

我使用SystemTap跟踪系统,以测量在不同 *** 作中花费的时间。 stat()和access()系统调用都使用user_path_at_empty()内核函数来表示查找 *** 作:

stap -ve ' global tm,times,path; probe lookup = kernel.function("user_path_at_empty") { name = "lookup"; pathname = user_string_quoted($name); } probe lookup.return = kernel.function("user_path_at_empty").return { name = "lookup"; } probe stat = syscall.stat { pathname = filename; } probe stat,syscall.access,lookup { if(pID() == target() && isinstr(pathname,"/usr/bin")) { tm[name] = local_clock_ns(); } } probe syscall.stat.return,syscall.access.return,lookup.return { if(pID() == target() && tm[name]) { times[name] <<< local_clock_ns() - tm[name]; delete tm[name]; } } ' -c 'python stat-access.py'

结果如下:

COUNT AVG lookup 80018 1.67 us stat 40106 3.92 us access 39903 4.27 us

请注意,我在我的实验中禁用了SElinux,因为它会对结果产生重大影响。

总结

以上是内存溢出为你收集整理的在Linux上,access()比stat()更快吗?全部内容,希望文章能够帮你解决在Linux上,access()比stat()更快吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1283212.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存