首先还是看一个用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. navigator 判断移动端是Android还是iOS

    let u = navigator.userAgent; let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > - ...

  2. 获取一个div下的li或者img元素

    上层div的xpath=//*[@id="launchpadOptionsList"] 其下的所有li的最后一个是//*[@id="launchpadOptionsLis ...

  3. bzoj3815: 卡常数

    随机数据,带修改,求到空间中到给定点距离为给定值的点的编号,唯一解. 建三维kdtree,对查询用可行性剪枝在树上找,由于数据随机,插入删除时不需要维护平衡. #include<bits/std ...

  4. IIS性能优化篇

    首先程序的优化,不只是沿着一个点进行,往往都是程序配合服务器及数据服务器配置提升性能. 第一步:数据库链接优化 在数据库链接字符串中添加“Max Pool Size=32767;”,32767是数据库 ...

  5. Requests+正则表达式 爬取猫眼电影

    代码: import re import json from multiprocessing import Pool import requests from requests.exceptions ...

  6. 使用python操作word

    有两种方式: 使用win32com 使用docx 1.使用win32com扩展包 只对windows平台有效 代码: # coding=utf-8 import win32com from win32 ...

  7. tomcat操作

    一.启动 D:\tomcat8.5.9\bin\startup   或者  D:\tomcat8.5.9\bin\catalina start 关闭tomcat: D:\tomcat8.5.9\bin ...

  8. mysql查询优化之四:优化特定类型的查询

    本文将介绍如何优化特定类型的查询. 1.优化count()查询count()聚合函数,以及如何优化使用了该函数的查询,很可能是mysql中最容易被误解的前10个话题之一 count() 是一个特殊的函 ...

  9. HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法

    爬虫多次访问同一个网站一段时间后会出现错误 HTTPConnectionPool(host:XX)Max retries exceeded with url '<requests.package ...

  10. 配置ssh服务允许root管理员直接登录

    配置ssh服务允许root管理员直接登录 [root@linux-node2 ~]# grep PermitRootLogin /etc/ssh/sshd_config PermitRootLogin ...