在C中查找文件大小

时间:2011-05-06 05:30:47

标签: c unix

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

5 个答案:

答案 0 :(得分:7)

fstat()fseek()/ftell()组合之间进行选择,不会有太大差异。单个函数调用应该比双函数调用稍快,但差别不会很大。

stat()和组合之间进行选择并不是一个非常公平的比较。对于组合调用,在打开文件时完成了艰苦的工作,因此inode信息随时可用。 stat()调用必须解析文件路径,然后报​​告它找到的内容。它应该几乎总是更慢 - 除非你最近打开文件,所以内核已经缓存了大部分信息。即便如此,stat()所需的路径名查找可能会使其慢于组合。

答案 1 :(得分:6)

如果你不确定,试试吧!

我刚编了这个测试。我生成了10,000个每个2KB的文件,并在所有文件上进行迭代,询问它们的文件大小。

我的机器上的结果是通过“time”命令测量并平均进行10次运行:

  • fseek / fclose版本:0.22秒
  • 统计版:0.06秒

所以,胜利者(至少在我的机器上): 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;
}

答案 2 :(得分:0)

逻辑上,人们会认为fseek()在提示寻找文件末尾时使用stat来知道要搜索的距离,或者更确切地说,文件末尾的位置。

这会使fseek比直接使用设施慢,并且它还要求您首先fopen该文件。

但是,任何性能差异都可以忽略不计,如果您出于某种原因需要打开文件,fseek / ftell可能会显着提高代码的可读性。

答案 3 :(得分:0)

对于stat.h,您主要想用它来告诉文件的统计信息。就像你想知道它是文件还是目录等

但是,如果你想对文件进行操作,那么你可能想要使用ftell()和fseek()。那就是你实际上正在对文件流本身进行操作。

所以在性能方面,它确实是你所需要的。

希望有所帮助:)干杯!

答案 4 :(得分:0)

根据具体情况,stat()可能比seek()/tell()快一百倍。我目前正在使用sshfs / FUSE,并且使用seek()/tell()获取几千个文件的文件大小需要花费一分多钟,使用stat()执行此操作只需要一秒钟。因此,在使用sshfs / FUSE时,差异非常大。