首先还是看一个用3中方式copy文件的测试Demo

分别是:普通Stream文件copy,BuffferedStream进行Copy 和Channel(nio)进行文件Copy的代码和性能测试报告:

 package com.ctyun.stream;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
/**
*
* @Description 文件效率copy测试
* @author zhanghw@chinatelecom.com.cn
* @since 2015年9月11日
* @version V1.0
*/
public class FileCopyEfficientTest { //普通io流copy
public static void commonCopy(String source, String dest){
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(new File(source));
out = new FileOutputStream(new File(dest)); byte[] b = new byte[2048];
while(in.read(b) != -1 ){
out.write(b);
}
out.flush(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(in != null){
in.close();
}
if(out != null){
out.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
in = null;
out =null;
e.printStackTrace();
}
}
} //Streambuffer进行copy
public static void bufferCopy(String source, String dest){
FileInputStream in = null;
FileOutputStream out = null;
BufferedInputStream bufferedIn = null;
BufferedOutputStream bufferedOut = null; try {
in = new FileInputStream(new File(source));
out = new FileOutputStream(new File(dest)); bufferedIn = new BufferedInputStream(in);
bufferedOut = new BufferedOutputStream(out); byte[] b = new byte[2048];
while(bufferedIn.read(b) != -1 ){
bufferedOut.write(b);
}
bufferedOut.flush(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(in != null){
in.close();
}
if(out != null){
out.close();
}
if(bufferedIn != null){
bufferedIn.close();
}
if(bufferedOut != null){
bufferedOut.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
in = null;
out =null;
bufferedIn = null;
bufferedOut = null;
e.printStackTrace();
}
}
} //用Channel进行copy
public static void channelCopy(String source, String dest){
FileInputStream in = null;
FileOutputStream out = null;
FileChannel channelIn = null;
FileChannel channelOut = null; try {
in = new FileInputStream(new File(source));
out = new FileOutputStream(new File(dest));
channelIn = in.getChannel();
channelOut = out.getChannel(); channelIn.transferTo(0, channelIn.size(), channelOut); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(in != null){
in.close();
}
if(out != null){
out.close();
}
if(channelIn != null){
channelIn.close();
}
if(channelOut != null){
channelOut.close();
} } catch (IOException e) {
// TODO Auto-generated catch block
in = null;
out =null;
channelIn = null;
channelOut = null;
e.printStackTrace();
}
} } //测试因为会线程原因,造成时间不正确
/*public static void main(String[] args) {
String source = "d:/test.txt";
String dest1 = "d:/temp/test1.txt";
String dest2 = "d:/temp/test2.txt";
String dest3 = "d:/temp/test3.txt"; long l1 = System.currentTimeMillis();
commonCopy(source, dest1);
long l2 = System.currentTimeMillis();
System.out.println("普通Stream Copy用时:"+(l2-l1)); bufferCopy(source, dest2);
long l3 = System.currentTimeMillis();
System.out.println("buffer Stream Copy用时:"+(l3-l2)); channelCopy(source, dest3);
long l4 = System.currentTimeMillis();
System.out.println("channel Stream Copy用时:"+(l4-l3)); }*/ public static void main(String[] args) {
String source = "d:/test.txt";
String dest = "d:/temp/test1.txt"; long l1 = System.currentTimeMillis();
// commonCopy(source, dest);
bufferCopy(source, dest);
// channelCopy(source, dest);
long l2 = System.currentTimeMillis();
System.out.println("Copy用时:"+(l2-l1)); } }

性能测试结果及结论:

测试1:不同文件大小测试时间(在同一main函数中进行测试)

大小 普通Copy(毫秒)
BufferCopy(毫秒)
ChannelCopy(毫秒)
文件类型
1m
56
72 
文本
128m
2095
1132 
文本
512m
9215
10444
文本
1g
19989 
49358 
44809
文本
2g
69266
63989
文本
 
结论:通过观察发现此次测试结果之间差异非常大,并且笔者在观察文件copy时,并没有按照正常顺序进行copy,所以(猜测)可能是在同一main方法中因为线程资源不均衡问题,造成测试结果差异较大,不准确(copy文件之间存在干扰)。
为证实以上结论继续如下测试:

测试2:在同一main函数中进行测试
1024M多次测试结果

测试次数
大小 普通Copy(毫秒)
BufferCopy(毫秒)
ChannelCopy(毫秒)
文件类型
1
1g
17365 
34371
27906 
文本
2
1g
39903 
35203 
文本
3
1g
43865 
36720
文本
--------------------------------------
结论:每次性能差异很大,原因可能是(猜测):在同一个main方法中由于文件流操作时线程获取cup资源的时间不同造成(copy文件之间存在干扰),
为了保证测试的准确性,修改测试为没法方法在main方法中单独测试。

单独测试,在一个个main方法运行时,保证只有一个copy方法运行(最终测试方案,正确)(copy文件之间相互独立,不存在干扰)

大小 普通Copy(毫秒)
BufferCopy(毫秒)
ChannelCopy(毫秒)
文件类型
1m
62
31
文本
128m
1953
907
文本
512m
8126
3422
文本
1g
86944
87572
17703
文本
2g
66079
55298
文本
 
测试次数
大小 普通Copy(毫秒)
BufferCopy(毫秒)
ChannelCopy(毫秒)
文件类型
1
1g
15281
8937
文本
2
1g
15485
7203
文本
3
1g
16068
6828
文本
 
结论:在通常情况下,nio的性能>buffered性能>普通Stream的性能,但是在小文件的时候Buffered性能会比nio好

1.深入分析_NIO性能分析的更多相关文章

  1. Java 性能分析工具 , 第 3 部分: Java Mission Control

    引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...

  2. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

  3. 性能分析神器VisualVM

    VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...

  4. 【转载】推荐5款超实用的.NET性能分析工具

    来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...

  5. 11个Visual Studio代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...

  6. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

  7. 【转】一文掌握 Linux 性能分析之内存篇

    [转]一文掌握 Linux 性能分析之内存篇 前面我们已经学习了 CPU 篇,这篇来看下内存篇. 01 内存信息 同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法. 1.1 /pro ...

  8. .NET 11 个 Visual Studio 代码性能分析工具

    原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...

  9. c# 推荐5款超实用的.NET性能分析工具

    虽然.NET框架号称永远不会发生内存泄漏,原因是引入了内存回收机制.但在实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最常见的情况就是给对象添加了事件处理函数,但当不 ...

随机推荐

  1. postgresql 查看数据库,表,索引,表空间以及大小

    转载 http://blog.51yip.com/pgsql/1525.html 1,查看数据库 playboy=> \l //\加上字母l,相当于mysql的,mysql> show d ...

  2. [蓝桥杯]ALGO-91.算法训练_Anagrams问题

    问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,“Unclear”和“Nuclear”.“Rimon”和“MinO ...

  3. 【linux】安装docker

    硬件Centos6.9 x86_64 1.查看centos内核,uname -r 目前,CentOS 仅发行版本中的内核支持 Docker. Docker 运行在 CentOS 7 上,要求系统为64 ...

  4. Boost--optional

    #include <vector> #include <deque> #include <iostream> #include <array> #inc ...

  5. 筛选法求n以内所有的素数

    求n以内所有的素数? 筛选法:将2到n中所有的数都列出来,然后从2开始,先化掉所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其内所有的倍数,最后剩下来的数就都是素数 例:13  红色为 ...

  6. Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用

    ylbtech-Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用 1.返回顶部 1. Java 实例 - enum 和 switch 语句 ...

  7. 简单的一个MySQL类的实现:

    '''定义MySQL类:1.对象有id.host.port三个属性2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一3.提供两种实例化方式,方式一:用户传入host和por ...

  8. 00013 - top命令详解

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不 ...

  9. PHP微信公众号开发之自动回复

    先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...

  10. 《Linux性能及调优指南》第二章:监控和基准工具2.1-2.2

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...