利用fstream进行文件拷贝测试
今天翻到一个早期写测试代码的目录,找到几个以前的测试代码,于是拿出来贴到博客中。(只是简单的测试,并不严谨。注意这里windows和linux的硬件环境不一样)
这一个是使用fstream进行文件拷贝的代码,测试机器的环境大概如下(时间久了,机器有更新)
CPU: i7 低压版 硬盘:两个60G的SSD,好像是建兴的 内存:8G DDR3
当时仅在Arch Linux
上做了测试,今天顺便在windows下做一个测试。
CentOS7_gcc4.9.4.ova其实是虚拟机的镜像文件,1.8G大小。
代码如下:
#include <fstream> #include <iostream> #include <iterator> #include <algorithm> bool copy_file(const char* src_file_path,const char* dst_file_path) { // 检测目标文件是否存在 { std::ifstream exsit(dst_file_path); if(exsit){ std::cout<<"目标文件 "<< dst_file_path<< " 已经存在"<<std::endl; return false; } } std::ifstream fin(src_file_path,std::ios::binary); std::ofstream fout(dst_file_path,std::ios::binary); if(!fin || !fout){ std::cout<<"打开源文件或目标文件失败"<<std::endl; return false; } // rdbuf返回streambuf* // 速度比迭代器拷贝快太多 // Linux下测试结果 // time ./fstream_copy_file.exe CentOS7_gcc4.9.4.ova /mnt/data/CentOS7_gcc4.9.4.ova // 0.23s user 8.15s system 10% cpu 1:16.98 total fout << fin.rdbuf(); return true; /* 使用迭代器进行拷贝没有大问题,但是效率不高 // time ./fstream_copy_file.exe CentOS7_gcc4.9.4.ova /mnt/data/CentOS7_gcc4.9.4.ova 407.45s user 4.37s system 97% cpu 7:00.73 total fin.unsetf(std::ios::skipws); //输入流默认跳过空白字符,取消此设置 // 使用迭代器进行拷贝 std::copy(std::istream_iterator<char>(fin), std::istream_iterator<char>(), std::ostream_iterator<char>(fout,"")); return true; */ } int main(int c,char** v) { if(c != 3){ printf("Usage:%s srcfile dstfile\n",v[0]); return 0; } copy_file(v[1],v[2]); return 0; }
测试结果如下:
Windows 10
Windows下使用VS2015编译,64位版本(time命令来自git-bash)
Windows下硬盘是两个机械硬盘之间拷贝(1T 7200转希捷)
# 使用rdbuf拷贝,速度大概50M每秒 $ time ./fstrean_copy_file.exe /g/CentOS7_gcc4.9.4.ova /d/CentOS7_gcc4.9.4.ova real 0m36.357s user 0m0.000s sys 0m0.015s # 使用std::copy拷贝,速度大概6M每秒 $ time ./fstrean_copy_file.exe /g/CentOS7_gcc4.9.4.ova /d/CentOS7_gcc4.9.4.ova real 5m3.663s user 0m0.000s sys 0m0.015s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理