C语言中的文件大小查找
我想知道,与fseek()和ftell()相比,使用sys/stat.h是否有任何显著的性能提高?从逻辑上讲,当提示查找文件末尾时,可以假设C语言中的文件大小查找,c,unix,C,Unix,我想知道,与fseek()和ftell()相比,使用sys/stat.h是否有任何显著的性能提高?从逻辑上讲,当提示查找文件末尾时,可以假设fseek()使用stat来知道要查找的距离,或者更确切地说,文件末尾在哪里 这将使fseek比直接使用设备慢,而且还要求您首先打开文件 尽管如此,任何性能差异都可能可以忽略不计,如果出于某种原因需要打开该文件,fseek/ftell可能会显著提高代码的可读性。在fstat()和fseek()/ftell()组合之间进行选择,不会有太大的区别。单函数调用应该
fseek()
使用stat来知道要查找的距离,或者更确切地说,文件末尾在哪里
这将使fseek
比直接使用设备慢,而且还要求您首先打开文件
尽管如此,任何性能差异都可能可以忽略不计,如果出于某种原因需要打开该文件,
fseek
/ftell
可能会显著提高代码的可读性。在fstat()
和fseek()/ftell()
组合之间进行选择,不会有太大的区别。单函数调用应该比双函数调用稍微快一点,但差别不会很大
在
stat()
和组合之间进行选择不是一个非常公平的比较。对于组合调用,在打开文件时就完成了艰苦的工作,因此inode信息随时可用。stat()
调用必须解析文件路径,然后报告找到的内容。它应该总是比较慢——除非您最近打开了文件,以便内核缓存了大部分信息。即使如此,stat()
所需的路径名查找可能会使其比组合更慢。对于stat.h,您主要希望使用它来告诉文件的统计信息。比如,如果你想知道它是一个文件还是一个目录,等等
但是,如果要对文件进行操作,则可能需要使用ftell()和fseek()。也就是说,您实际上正在对文件流本身进行操作
所以在性能方面,这才是你真正需要的
希望有帮助:)干杯 如果你不确定,试试看 我刚刚编写了这个测试。我生成了10000个每个2KB的文件,并对它们进行了迭代,询问它们的文件大小 通过使用“time”命令测量并平均运行10次,在我的机器上得到的结果:
- fseek/fclose版本:0.22秒
- 统计版本:0.06秒
#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;
}
#包括
#包括
#如果0
大小\u t getFileSize(常量字符*文件名)
{
结构统计;
stat(文件名,&st);
返回st.st_大小;
}
#否则
大小\u t getFileSize(常量字符*文件名)
{
FILE*fd=fopen(文件名,“rb”);
如果(!fd)
printf(“文件%s\n上的错误”,文件名);
fseek(fd,0,SEEK_END);
大小_tsize=ftell(fd);
fclose(fd);
返回大小;
}
#恩迪夫
int main()
{
char-buf[256];
inti,n;
对于(i=0;i根据具体情况,stat()
比seek()/tell()
快上百倍。我目前正在玩弄sshfs/FUSE,用seek()/tell()
获得几千个文件的文件大小需要一分钟多的时间,用stat()完成
需要一秒钟。因此,在sshfs/FUSE上工作时,差异非常大。您是否尝试过为每种方法编写一个小程序,并自己测量速度?