java中多种写文件方式的效率对比实验
一、实验背景
最近在考虑一个问题:“如果快速地向文件中写入数据”,java提供了多种文件写入的方式,效率上各有异同,基本上可以分为如下三大类:字节流输出、字符流输出、内存文件映射输出。前两种又可以分为带buffer及不带buffer。
二、实验目标
通过实验找出单线程场景下文件写入效率最高的方式,并量化各种文件写入方式在效率上的差距。
三、实验设计
为减少其他环节的影响,示例代码使用循环输出同一字符串多次的方式测试整个输出环节的耗时,通过耗时、服务器资源使用情况(cpu、内存使用)等指标评判各种文件写入方式的效率好坏。
四、实验环境
OS: windows 7 64bit
cpu: 4core, 主频:2.4GHZ
mem:6G
五、实验步骤
总共进行8次输出实验,依次输出的文件大小为:10M、50M、100M、200M、500M、800M、1G、2G;
每次输出后记录各种方式的耗时情况,并填表。
五、实验结果
表1、java各种文件写入方法效率对比实验时延数据表

表1、java各种文件写入方法效率对比实验时延结果图(含大文件)

表2、java各种文件写入方法效率对比实验时延结果图(不含大文件)

图2、文件大小为2048m时,各个写入方式执行任务时cpu使用情况:

图3、文件大小为2048m时,各个写入方式执行任务时jvm内存使用情况

图4、文件大小为2048m时,各个写入方式执行任务时物理内存使用情况:
上图中红圈中为‘FileChannel’方式下的物理内存使用情况。
六、实验结论
1、基本上,五种写入方式的时延从小到大排序为:FileChannel<BufferedOutputStream<FileOutputStream<BufferedWriter<FileWriter;从表1、图1;可以看出;且该规律在小文件写入的情景下,更为明显,图2可以看出;
2、在同样文件大小写入的场景中,通常意义上带buffer的字节流输入/字符流输入比不带buffer的对应流效率要高;
3、各个写入方式的jvm cpu和内存使用情况大致相当,从图2和图3可以看出;
4、文件达到一定大小后( fileSize >=1.5G ),FileChannel的时延变得很大且不稳定,从图1最右边可以看出;同时,物理内存的使用量基本和写入文件大小相当,从图4可以看出;原因在于FileChannel使用MappedByteBuffer写入,这个buffer是direct buffer,直接操作物理内存写入,故而造成物理内存消耗严重。
5、小文件写入的场景下(1M左右),FileChannel有些大材小用了,效率上反而没有字节流效率高。
综上,我们可以得到几条有价值的使用经验:
1、小文件(几M的文件)写入时,使用常规的io输入就行,最优选择是BufferedInportStream,没有必要使用nio的FileChannel;
2、大文件(fileSize > 1G,这是个经验值,需要根据具体环境具体分析)写入时,使用FileChannel需要小心物理内存的瓶颈带来的写入效率低下,可以考虑使用分段写入的方式(TODO:后续实验给出);
3、其他场景下,如果效率优先的考虑,则优先选择FileChannel写入文件。
七、demo
参考git仓库:https://github.com/daoqidelv/io-demo
java中多种写文件方式的效率对比实验的更多相关文章
- java中IO写文件工具类
以下是一些依据经常使用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 当中jodd中提供的JavaUtil类中提供的方法足 ...
- java中多种方式读文件
转自:http://www.jb51.net/article/16396.htm java中多种方式读文件 一.多种方式读文件内容. 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内 ...
- 【练习】Java中的读文件,文件的创建,写文件
前言 大家好,给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 读文件 public static void read(String path,String filename){ ...
- Java中的读文件,文件的创建,写文件
前言 大家好,我是 Vic,今天给大家带来Java中的读文件,文件的创建,写文件的概述,希望你们喜欢 示意图 读文件 public static void read(String path,Strin ...
- Java文件操作类效率对比
前言 众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例: 面向字节流的:FileOutputStream 和 BufferedOutputStream 面向 ...
- java 中获得 资源文件方法
1 java 中获取资源文件的方法 项目目录如下 获取当前项目的目录路径 方法一:使用类名 MergeDocHandler.class.getClassLoader().getResource(&qu ...
- Java中LinkedList的fori和foreach效率比较
在<Java中ArrayList的fori和foreach效率比较>中对ArrayList的两种循环方式进行了比较,本次对LinkedList的两种遍历方式进行效率的比较. 1. list ...
- JS 和 Java 中URL特殊字符编码方式
前几天遇到url特殊字符编码的问题,在这里整理一下: JavaScript 1. 编码 escape(String) 其中某些字符被替换成了十六进制的转义序列. 解码 unescape(String ...
- Java中创建操作文件和文件夹的工具类
Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...
随机推荐
- 【2017-03-30】JS-document对象
一.获取标记对象 1.document.getElementById("id"); 根据id找,最多找到一个. 2.document.getElementsByNa ...
- 机器学习:形如抛物线的散点图在python和R中的非线性回归拟合方法
对于样本数据的散点图形如函数y=ax2+bx+c的图像的数据, 在python中的拟合过程为: ##最小二乘法 import numpy as np import scipy as sp import ...
- 快速找到Office应用程序安装路径
p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...
- POPTEST 150801 祝大家前途似锦
POPTEST 150801 祝大家前途似锦 PT20150801学员不断在就业,同学们走好,远兵辛苦了!!!
- Maven项目热部署到Tomcat容器下
第一步: 配置Tomcat的登陆的用户名与密码 在 apache-tomcat-7.0.33\conf\ tomcat-users.xml,第40行添加如下: <role rolenam ...
- JavaScript运算符优先级
图片引用自:http://www.cnblogs.com/xxcanghai/p/5189353.html
- Tensorflow学习笔记---0--TensorBoard
运行mnist_with_summaries学习TensorBoard时,由于需要GPU支持,运行窗口报错:Couldn't open CUDA library cupti64_80.dll 解决办法 ...
- Python学习_ConfigParse (转)
1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该se ...
- 《Python自然语言处理》第二章 学习笔记
import nltk from nltk.book import * nltk.corpus.gutenberg.fileids() emma = nltk.corpus.gutenberg.wor ...
- App字体大小不随系统改变而改变
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6713724.html 在 "设置" , "显示" , " ...