[英]File size lookup in C
我想知道使用sys / stat.h与fseek()和ftell()是否有任何显着的性能提升?
在fstat()
和fseek()/ftell()
组合之间进行选择,不会有太大的区别。 单个函数调用应该比双函数调用稍快,但差异不会很大。
在stat()
和组合之间进行选择并不是一个非常公平的比较。 对于组合调用,在打开文件时完成了艰苦的工作,因此inode信息随时可用。 stat()
调用必须解析文件路径,然后报告它找到的内容。 它应该几乎总是更慢 - 除非你最近打开文件,所以内核已经缓存了大部分信息。 即便如此, stat()
所需的路径名查找可能会使其比组合慢。
如果你不确定,试试吧!
我刚编了这个测试。 我生成了10,000个每个2KB的文件,并在所有文件上进行迭代,询问它们的文件大小。
通过使用“time”命令进行测量并平均进行10次运行,在我的机器上得到结果:
所以,胜利者(至少在我的机器上): stat !
这是测试代码:
#include <stdio.h>
#include <sys/stat.h>
#if 0
size_t getFileSize(const char * filename)
{
struct stat st;
stat(filename, &st);
return st.st_size;
}
#else
size_t getFileSize(const char * filename)
{
FILE * fd=fopen(filename, "rb");
if(!fd)
printf("ERROR on file %s\n", filename);
fseek(fd, 0, SEEK_END);
size_t size = ftell(fd);
fclose(fd);
return size;
}
#endif
int main()
{
char buf[256];
int i, n;
for(i=0; i<10000; ++i)
{
sprintf(buf, "file_%d", i);
if(getFileSize(buf)!= 2048)
printf("WRONG!\n");
}
return 0;
}
根据具体情况, stat()
可以比seek()/tell()
快一百倍。 我目前正在使用sshfs / FUSE,并使用seek()/tell()
获取几千个文件的文件大小需要一分钟,使用stat()
需要一秒钟。 因此,在使用sshfs / FUSE时,差异非常大。
从逻辑上讲,人们会认为fseek()
在提示寻找到文件的末尾时使用stat来知道要寻找多远,或者更确切地说,知道文件末尾的位置。
这将使fseek
比直接使用设施慢,并且它还要求您首先fopen
文件。
尽管如此,任何性能差异都可以忽略不计,如果你出于某种原因需要打开文件, fseek
/ ftell
可能会显着提高代码的可读性。
对于stat.h,您主要想用它来告诉文件的统计信息。 就像你想知道它是文件还是目录等。
但是,如果你想对文件进行操作,那么你可能想要使用ftell()和fseek()。 那就是你实际上正在对文件流本身进行操作。
所以在性能方面,它确实是你所需要的。
希望它有所帮助:)干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.