首先还是看一个用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. 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作

    一.引言 5月8日,作为受邀嘉宾,参加了Intel与Cloudera在北京中国大饭店新闻发布会,两家公司宣布战略合作,该消息成为继Intel宣布放弃大数据平台之后的另外一个热点新闻.对于Intel的放 ...

  2. pytest.1.快速开始

    From: http://www.testclass.net/pytest/quick_start/ 简介 pytest测试框架可以让我们很方便的编写测试用例,这些用例写起来虽然简单,但仍然可以规模化 ...

  3. leedcode_贪心算法系列

    861. 翻转矩阵后的得分 思路: 行首的权值最大,故首先将其置1; 每列由于权值相同,故只需要将0多于1的情况反转即可 763. 划分字母区间 思路: 1.计算每个字母的最右边界下标,并记录到新数组 ...

  4. TCP/IP学习20180627-数据链路层-ethernet

    ifconfig :查看主機支持的網絡協議eth0:以太網接口lo:loopback接口 以太网(Ether-net)的定是指数字设备公司( Digital Equipment Corp.).英特尔公 ...

  5. ribbon的注解使用报错--No instances available for [IP]

    使用RestTemplate类调用其他系统的url的时候,加上ribbon的注解@LoadBalanced上这个注解之后访问,就报错了. 报错如下: 因为这里你不能直接访问地址,需要把地址改成你所调用 ...

  6. python 正则表达提取方法 (提取不来的信息print不出来 加个输出type 再print信息即可)

    1,正则表达提取 (findall函数提取) import re a= "<div class='content'>你大爷</div>"x=re.finda ...

  7. spring AOP 之一:spring AOP功能介绍

    一.AOP简介 AOP:是一种面向切面的编程范式,是一种编程思想,旨在通过分离横切关注点,提高模块化,可以跨越对象关注点.Aop的典型应用即spring的事务机制,日志记录.利用AOP可以对业务逻辑的 ...

  8. Python——函数,模块,简单文件读写(python programming)

    函数(function)定义原则: 最大化代码重用,最小化代码冗余,流程符合思维逻辑,少用递归; 函数的定义方法: def function_name(param_1, param_2): ..... ...

  9. 学习笔记之C / C++

    面试总结之C/C++ - 浩然119 - 博客园 https://www.cnblogs.com/pegasus923/p/5558919.html 学习笔记之C++ How to Program(p ...

  10. Scrapy学习篇(三)之创建项目和Scrapy的安装

    安装Scrapy 了解了Scrapy的框架和部分命令行之后,创建项目,开始使用之前,当然是安装Scrapy框架了. 关于Scrapy框架的安装,请参考:https://cuiqingcai.com/5 ...