1.深入分析_NIO性能分析
首先还是看一个用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)); } }
性能测试结果及结论:
| 大小 | 普通Copy(毫秒) |
BufferCopy(毫秒)
|
ChannelCopy(毫秒) |
文件类型
|
|
1m
|
56 |
72
|
文本
|
|
|
128m
|
2095 |
1132
|
文本
|
|
|
512m
|
9215 |
10444
|
文本
|
|
|
1g
|
19989
|
49358
|
44809
|
文本
|
|
2g
|
69266
|
63989
|
文本
|
测试2:在同一main函数中进行测试
|
测试次数
|
大小 | 普通Copy(毫秒) |
BufferCopy(毫秒)
|
ChannelCopy(毫秒) |
文件类型
|
|
1
|
1g
|
17365 |
34371
|
27906
|
文本
|
|
2
|
1g
|
39903 |
35203
|
文本
|
|
|
3
|
1g
|
43865 |
36720
|
文本
|
单独测试,在一个个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
|
文本
|
1.深入分析_NIO性能分析的更多相关文章
- Java 性能分析工具 , 第 3 部分: Java Mission Control
引言 本文为 Java 性能分析工具系列文章第三篇,这里将介绍如何使用 Java 任务控制器 Java Mission Control 深入分析 Java 应用程序的性能,为程序开发人员在使用 Jav ...
- Android APP性能分析方法及工具
近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...
- 性能分析神器VisualVM
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回 ...
- 【转载】推荐5款超实用的.NET性能分析工具
来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...
- 11个Visual Studio代码性能分析工具
软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
- 【转】一文掌握 Linux 性能分析之内存篇
[转]一文掌握 Linux 性能分析之内存篇 前面我们已经学习了 CPU 篇,这篇来看下内存篇. 01 内存信息 同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法. 1.1 /pro ...
- .NET 11 个 Visual Studio 代码性能分析工具
原文地址 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行 ...
- c# 推荐5款超实用的.NET性能分析工具
虽然.NET框架号称永远不会发生内存泄漏,原因是引入了内存回收机制.但在实际应用中,往往我们分配了对象但没有释放指向该对象的引用,导致对象永远无法释放.最常见的情况就是给对象添加了事件处理函数,但当不 ...
随机推荐
- postgresql 查看数据库,表,索引,表空间以及大小
转载 http://blog.51yip.com/pgsql/1525.html 1,查看数据库 playboy=> \l //\加上字母l,相当于mysql的,mysql> show d ...
- [蓝桥杯]ALGO-91.算法训练_Anagrams问题
问题描述 Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的.例如,“Unclear”和“Nuclear”.“Rimon”和“MinO ...
- 【linux】安装docker
硬件Centos6.9 x86_64 1.查看centos内核,uname -r 目前,CentOS 仅发行版本中的内核支持 Docker. Docker 运行在 CentOS 7 上,要求系统为64 ...
- Boost--optional
#include <vector> #include <deque> #include <iostream> #include <array> #inc ...
- 筛选法求n以内所有的素数
求n以内所有的素数? 筛选法:将2到n中所有的数都列出来,然后从2开始,先化掉所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其内所有的倍数,最后剩下来的数就都是素数 例:13 红色为 ...
- Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用
ylbtech-Java-Runoob-高级教程-实例-方法:11. Java 实例 – enum 和 switch 语句使用 1.返回顶部 1. Java 实例 - enum 和 switch 语句 ...
- 简单的一个MySQL类的实现:
'''定义MySQL类:1.对象有id.host.port三个属性2.定义工具create_id,在实例化时为每个对象随机生成id,保证id唯一3.提供两种实例化方式,方式一:用户传入host和por ...
- 00013 - top命令详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不 ...
- PHP微信公众号开发之自动回复
先把源码类发出来 <?php /** 自己封装 微信 开发api */ header('Content-type: text/html; charset=utf-8');#设置头信息 class ...
- 《Linux性能及调优指南》第二章:监控和基准工具2.1-2.2
翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...