您的位置:首页 > 其它

fstream与 C 风格(例如fread 和 fwrite )两种读写文件方法的效率比较

2017-04-04 23:07 621 查看
为了探录c++ 风格的fstream与 C 风格(例如fread 和 fwrite )两种读写文件的方法的效率,我特意做了两个实验。
 
我的机器是Windows XP, Visual Studio 2008
 
1. 测试写文件速度
 
 
程序设计思路: 将TEST_SIZE个字符用两种方式写入文件,记录两种方式的耗时。
 
 
实验代码:
 

[cpp] view plain copy

void test_write()  
{     
    const int TEST_SIZE = 10000000 ;  
    const char* c_plus_write_file = "H://c_plus_write_file.txt";  
    const char* c_write_file = "H://c_write_file.txt";  
      
    cout<<"Test size :" << TEST_SIZE <<endl;  
    //c++ style writing file  
    ofstream of(c_plus_write_file);  
    assert(of);  
    time_t start, end;  
    start =  clock();  
    for(int i=0; i < TEST_SIZE; ++i)  
    {  
        char tmp[1];  
        tmp[0] = char(i);  
        of << tmp[0];  
    }  
    end = clock();  
    of.close();  
    cout<<"C++ style: "<<end - start <<" ms"<<endl;  
    //c style writing file  
    FILE* fp = fopen(c_write_file, "w");  
    start =  clock();  
    for(int i=0; i < TEST_SIZE; ++i)  
    {  
        char tmp[1];  
        tmp[0] = char(i);  
        fwrite( tmp, 1, 1, fp);  
    }  
    end = clock();  
    fclose(fp);  
    cout<<"C style: "<<end - start <<" ms"<<endl;  
    cin.get();  
}  

 
 
实验结果:



图1



图2



图3
 
**从图1、2、3,可以看出, ofstream 的 << 运算符 所耗时 是fwrite()的近三倍
 
 
把of<<的代码改成了: of.write(tmp,1); 后结果:
 
 
实验代码:
 

[cpp] view plain copy

void test_write()  
{     
    const int TEST_SIZE = 1000000 ;  
    const char* c_plus_write_file = "H://c_plus_write_file.txt";  
    const char* c_write_file = "H://c_write_file.txt";  
      
    cout<<"Test size :" << TEST_SIZE <<endl;  
    //c++ style writing file  
    ofstream of(c_plus_write_file);  
    assert(of);  
    time_t start, end;  
    start =  clock();  
    for(int i=0; i < TEST_SIZE; ++i)  
    {  
        char tmp[1];  
        tmp[0] = char(i);  
        of.write(tmp,1);  
    }  
    end = clock();  
    of.close();  
    cout<<"C++ style: "<<end - start <<" ms"<<endl;  
    //c style writing file  
    FILE* fp = fopen(c_write_file, "w");  
    start =  clock();  
    for(int i=0; i < TEST_SIZE; ++i)  
    {  
        char tmp[1];  
        tmp[0] = char(i);  
        fwrite( tmp, 1, 1, fp);  
    }  
    end = clock();  
    fclose(fp);  
    cout<<"C style: "<<end - start <<" ms"<<endl;  
    cin.get();  
}  

 
实验结果:
 



图4



图5



图6
 
 
对比图4 和 图1、 图5 和 图2、图6 和 图3, 可以看到  << 运算符没有 ofstream.write(), 快, 但两者还是没有 fwrite() 快
 
结论: 效率   fwrite() >  ofstream.operator<<() > ofstream.write() 
 
 
 
 
3. 下面做读文件的比较:
 
程序设计思路: 用两种方法去读一个近100M的文本,记录时间。
 
实验代码:

[cpp] view plain copy

void test_read()  
{     
    const char* read_file = "H://read4.txt";  
    const int BUF_SIZE = 1024 ;  
    char buf[BUF_SIZE];  
    //c++ style writing file  
    ifstream ifs(read_file,<a href="http://lib.csdn.net/base/ios" class='replace_word' title="iOS知识库" target='_blank' style='color:#df3434; font-weight:bold;'>iOS</a>::binary);  
    assert(ifs);  
    time_t start, end;  
    start =  clock();  
    while(!ifs.eof())  
    {  
      ifs.read(buf,BUF_SIZE);  
    }  
    end = clock();  
    ifs.close();  
    cout<<"C++ style: "<<end - start <<" ms"<<endl;  
    //c style writing file  
    FILE* fp = fopen(read_file, "rb");  
    start =  clock();  
    int len = 0;  
    do  
    {  
        len = fread(buf,1,BUF_SIZE,fp);  
        //cout<<len<<endl;  
    }while(len != 0);  
    end = clock();  
    fclose(fp);  
    cout<<"C style: "<<end - start <<" ms"<<endl;  
    cin.get();  
}  

 
 
实验结果:



图7
 
结论: 读取一个 100M 的文件, fread() 的效率 是 ifstream.read()的将近十倍! (此结论惊人!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: