选择之间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;
}
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,人们会假设当fseek()提示查找文件末尾时,使用 stat 来知道查找多远,或者更确切地说,知道文件末尾在哪里。
这会fseek比直接使用这些设施慢,而且它还需要您fopen首先创建该文件。
尽管如此,任何性能差异都可能可以忽略不计,并且如果您出于某种原因需要打开文件,fseek/ftell可能会显着提高代码的可读性。
| 归档时间: |
|
| 查看次数: |
3063 次 |
| 最近记录: |