注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

老和山小和尚

敬天爱人

 
 
 

日志

 
 
 
 

stat和fopen哪个速度快?  

2008-10-15 14:46:01|  分类: 开发相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
stat和fopen哪个速度快?
更新日期:2008-10-15
 
在linux中,打开一个文件快(如:fopen或open)还是打开一个文件状态(如:fstat或stat)快?废话,当然是stat快,stat放在文件系统中,而文件系统又放在内存中(?待考)。那么快多少呢?唔。。问系统吧。

在我实际的工作中碰到这样一个问题:对于某个文件,我可能就要读它的内容第一行数据,来判断它是否是个特殊文件。而特殊文件有个特点,就是文件长度特别小。我是否可以先读文件状态,如果文件大小小于一定长度,我才去读文件呢?否则就没必要去打开这个文件了。这样多了一个读stat的时间,而少了一部分open和读文件的时间。对于我现实中的环境中,是否会节省时间呢?
假设每次读stat文件是a毫秒,而每次fopen读文件是b毫秒,特殊文件的比例为x,总文件数为n,那么计算公式为:
axn + b(1-x)n > 10n

在我的机器上(P4 3.0双核,256M内存,VM6.0.3,Linux debian-yaoweibin 2.6.18-6-686 #1 SMP Mon Aug 18 08:42:39 UTC 2008 i686 GNU/Linux ),分别stat和open某个文件1、10、100、1000次的结果:

stat和open的测试代码为:

#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char **argv)
{
#ifdef STAT
    struct stat buf;
#else
    FILE *fp;
    char read_line[256];
#endif
    int i = 1;
    if (argc < 2)
        printf("usage:test num");
    i = atoi(argv[1]);
    while(i--){
#ifdef STAT
        stat("openfile.c", &buf);
#else
        fp = fopen("openfile.c", "r");
        fgets(read_line, 256, fp);
        fclose(fp);
#endif
    }
    return 0;
}
根据gcc -g openfile.c 和gcc -g -DSTAT openfile.c分别编译。
测试命令为:
time ./test [1 10 100 1000]
使用time命令可以测试某个命令的执行长度,realtime是指令的真实执行时间,usertime是用户空间的执行时间长度,systime是系统空间的执行时间长度,两者相加等于realtime。
可以看出stat方式时:
1、realtime增长缓慢
2、usertime几乎为0
3、systime增长缓慢
fopen方式:
1、realtime接近于线性增长
2、usertime增长缓慢
3、systime线性增长,从1到10次时系统调用时间减少可能是由于先前该文件没用调入内存出现缺页而反倒慢的原因。
从以上可以得出,fopen、fclose的系统调用时间耗费极大,几乎系统没有作什么优化,所以呈线性增长。
通过实验和我们实际碰到的问题,假设每次读stat文件是5毫秒,而每次fopen读文件是10毫秒,特殊文件的比例为x,总文件数为n,那么:
10n = 5xn + 15(1-x)n
解得x=0.5。
所以可得出结论,如果特殊文件的比例不超过50%的情况下,多使用一次stat来判断大小是合算的。
 
  评论这张
 
阅读(1219)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018