Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的文件大小查找_C_Unix - Fatal编程技术网

C语言中的文件大小查找

C语言中的文件大小查找,c,unix,C,Unix,我想知道,与fseek()和ftell()相比,使用sys/stat.h是否有任何显著的性能提高?从逻辑上讲,当提示查找文件末尾时,可以假设fseek()使用stat来知道要查找的距离,或者更确切地说,文件末尾在哪里 这将使fseek比直接使用设备慢,而且还要求您首先打开文件 尽管如此,任何性能差异都可能可以忽略不计,如果出于某种原因需要打开该文件,fseek/ftell可能会显著提高代码的可读性。在fstat()和fseek()/ftell()组合之间进行选择,不会有太大的区别。单函数调用应该

我想知道,与fseek()和ftell()相比,使用sys/stat.h是否有任何显著的性能提高?

从逻辑上讲,当提示查找文件末尾时,可以假设
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上工作时,差异非常大。

您是否尝试过为每种方法编写一个小程序,并自己测量速度?