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

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

Solutions Collecting From Web of "在Linux上,access()比stat()更快吗?"

理论

我不信。

在较低层的内核中, access()stat()调用在执行查找操作时没有太大区别:它们将文件名映射到dentry缓存中的一个入口和inode (它是实际的内核结构, inode )。 查找是慢操作,因为你需要为路径的每个部分执行它,即/usr/bin/cat你将需要查找usrbin ,然后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", &s); // lookups usr, 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,因为它会对结果产生重大影响。