今天翻到一个早期写测试代码的目录,找到几个以前的测试代码,于是拿出来贴到博客中。(只是简单的测试,并不严谨。注意这里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

利用fstream进行文件拷贝测试的更多相关文章

  1. [20171221]利用rman实现2台机器文件拷贝.txt

    [20171221]利用rman实现2台机器文件拷贝.txt --//昨天使用rman duplicate建立dg,我看到执行如下代码: RMAN> duplicate target datab ...

  2. 文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

     1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; ...

  3. 利用pom配置实现静态文件拷贝

    java项目有时候需要将一些静态文件拷贝到生成的test-class文件夹或者其他地方,虽然手动拷贝可以做到,但是很麻烦.今天主要讲解如何利用pom.xml进行动态的拷贝. 具体的配置信息如下,在de ...

  4. Java IO和Java NIO在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

  5. Java IO和Java NIO 和通道 在文件拷贝上的性能差异分析

    1.  在JAVA传统的IO系统中,读取磁盘文件数据的过程如下: 以FileInputStream类为例,该类有一个read(byte b[])方法,byte b[]是我们要存储读取到用户空间的缓冲区 ...

  6. 文件拷贝, 使用 BIO,NIO的对比,四种写法性能分析。

    测试环境: jdk 1.7 +  2G内存 测试代码基本上复制了: http://blog.csdn.net/tabactivity/article/details/9317143 1 2 3 4 5 ...

  7. Java实现文件拷贝的4种方法.

    原文地址:http://blog.csdn.net/ta8210/article/details/2073817 使用 java 进行文件拷贝 相信很多人都会用,,不过效率上是否最好呢? 最近看了看N ...

  8. 几种基于javaI/O的文件拷贝操作比较

    最近公司的项目用到文件拷贝,由于涉及到的大量大文件的拷贝工作,代码性能问题显得尤为重要,所以写了以下例子对几种文件拷贝操作做一比较: 0.文件拷贝测试方法 public static void fil ...

  9. Java利用内存映射文件实现按行读取文件

    我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...

随机推荐

  1. POJ 3579 3685(二分-查找第k大的值)

    POJ 3579 题意 双重二分搜索:对列数X计算∣Xi – Xj∣组成新数列的中位数 思路 对X排序后,与X_i的差大于mid(也就是某个数大于X_i + mid)的那些数的个数如果小于N / 2的 ...

  2. BZOJ1826 [JSOI2010]缓存交换 堆 贪心

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1826 题意概括 Cache中有m个储存单元,接下来有n个访问地址,每个地址用一个数字表示.访问每一 ...

  3. Python爬虫之正则表达式的使用(三)

    正则表达式的使用 re.match(pattern,string,flags=0) re.match尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none 参数 ...

  4. 机器学习 Logistic 回归

    Logistic regression 适用于二分分类的算法,用于估计某事物的可能性. logistic分布表达式 $ F(x) = P(X<=x)=\frac{1}{1+e^{\frac{-( ...

  5. Django 学习第一天——django 基本介绍和环境搭建

    web 应用设计模式(MTV MVC): MTV: M:models 模型:负责业务数据对象与数据库对象: T:templates 模板:负责如何把数据展示给用户: V:views 视图:负责业务逻辑 ...

  6. Scala面向接口

    trait Logger{ def log(message:String){ println("Logger:"+message) } } trait RichLogger ext ...

  7. java中thread的start()和run()的区别

    1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪 ...

  8. [LintCode/LeetCode]——两数和、三数和、四数和

    LintCode有大部分题目来自LeetCode,但LeetCode比较卡,下面以LintCode为平台,简单介绍我AC的几个题目,并由此引出一些算法基础. 1)两数之和(two-sum) 题目编号: ...

  9. BZOJ 4552 [Tjoi2016&Heoi2016]排序 线段树的分裂和合并

    https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...

  10. 5410 ACM 杭电 01+完全背包

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5410 虽然是英文题目:但还是很好理解的.明显的背包问题 思路:如果你能想到把题目拆分成小问题,就会简单许多 ...