`

[java][nio]Stream与MappedByteBuffer的性能比较

阅读更多

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;
/**
 * 
 * Stream与MappedByteBuffer的性能对比.
 * 
Stream Write : 3.59
Mapped Write : 0.27
Stream Read : 3.17
Mapped Read : 0.21
Stream Read/Write : 30.86
Mapped Read/Write : 0.15
 * 
 *
 */
public class MappedIO {
	
	private static int numOfInts = 4000000;
	private static int numOfUbuffInts = 200000;
	
	private abstract static class Tester {
		
		private String name;
		
		public Tester(String name){
			this.name = name;
		}
		
		public void runTest(){
			System.out.print(name + " : ");
			try {
				long start = System.nanoTime();
				test();
				double duration = System.nanoTime() - start;
				System.out.format("%.2f\n", duration/1.0e9);
			} catch (IOException e) {
				throw new RuntimeException(e);
			}
		}
		
		public abstract void test() throws IOException ;
	}
	
	private static Tester[] tests = {
		new Tester("Stream Write"){
			public void test() throws IOException{
				DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File("d:\\temp.tmp"))));
				for(int i = 0; i < numOfInts; i++){
					dos.writeInt(i);
				}
				if(dos != null){
					dos.close();
				}
			}
		},
		new Tester("Mapped Write"){
			public void test() throws IOException{
				FileChannel fc = new RandomAccessFile("d:\\temp.tmp", "rw").getChannel();
				IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
				for(int i = 0; i < numOfInts; i++){
					ib.put(i);
				}
				if(fc != null){
					fc.close();
				}
			}
		},
		new Tester("Stream Read"){
			public void test() throws IOException{
				DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(new File("d:\\temp.tmp"))));
				for(int i = 0; i < numOfInts; i++){
					dis.readInt();
				}
				if(dis != null){
					dis.close();
				}
			}
		},
		new Tester("Mapped Read"){
			public void test() throws IOException{
				FileChannel fc = new FileInputStream("d:\\temp.tmp").getChannel();
				IntBuffer ib = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size()).asIntBuffer();
				while(ib.hasRemaining()){
					ib.get();
				}
				if(fc != null){
					fc.close();
				}
			}
		},
		new Tester("Stream Read/Write"){
			public void test() throws IOException{
				RandomAccessFile raf = new RandomAccessFile("d:\\temp.tmp","rw");
				raf.writeInt(1);
				for(int i = 0; i < numOfUbuffInts; i++){
					raf.seek(raf.length() - 4);//绝对定位,离文件头的字节数.skipBytes相对定位,跳过指定长度。
					raf.writeInt(raf.readInt());
				}
				if(raf != null){
					raf.close();
				}
			}
		},
		new Tester("Mapped Read/Write"){
			public void test() throws IOException{
				FileChannel fc = new RandomAccessFile("d:\\temp.tmp", "rw").getChannel();
				IntBuffer ib = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size()).asIntBuffer();
				ib.put(0);
				for(int i = 1; i < numOfUbuffInts; i++){
					ib.put(ib.get( i - 1));
				}
				if(fc != null){
					fc.close();
				}
			}
		}
	};
	
	public static void main(String[] args) {
		for(Tester tst : tests){
			tst.runTest();
		}
	}
}


分享到:
评论

相关推荐

    java nio入门学习,两个pdf

    在Java 1.4版本中引入,NIO提供了一种全新的I/O编程方式,使得Java开发者能够更高效地处理I/O操作,特别是在处理大量并发连接时,性能提升尤为显著。本篇文章将深入探讨Java NIO的基本概念、核心组件以及实际应用。 ...

    Java NIO入门

    传统的Java I/O基于流(Stream)和缓冲区(Buffer)的模型是阻塞式的,当进行I/O操作时,程序会等待数据准备好或写入完成,这在处理大量并发请求时可能会成为性能瓶颈。 NIO的核心组件包括以下几个部分: 1. **通道...

    Java NIO教程文档

    Java NIO(New IO),从 Java 1.4 开始引入,是 Java 标准 IO API 的一个补充,提供了与标准 IO 不同的工作方式。Java NIO 的主要特性包括: 1. **基于通道(Channel)和缓冲区(Buffer)的操作**:与标准 IO 基于字节...

    Java nio详细介绍 详细介绍java nio

    ### Java NIO 详解 ...通过以上介绍,我们可以看出Java NIO相比传统IO具有明显的性能优势,尤其是在处理大量并发连接和大数据量传输时。理解NIO的基本概念和组件是掌握Java网络编程和文件IO的关键。

    javaNIO学习笔记

    ### Java NIO 学习笔记 #### 一、概述 Java NIO (Non-Blocking IO,也称为 Java New IO),是 Java 对传统 IO 模型的一次重大改进,旨在提高程序处理大量并发连接的能力。NIO 的核心组件包括 Channels、Buffers 和 ...

    JAVA IO-NIO 详解

    Java的IO与NIO是程序与外部环境交互的基础,它们各自具有独特的优势和应用场景。传统IO适用于简单且低并发的场景,而NIO则更适合高并发、高性能的应用。通过深入理解Channel、Buffer和Selector等核心组件的工作原理...

    NIO入门pdf分享

    NIO,全称New Input/Output,是从Java 1.4版本开始引入的一个新特性,它与传统的IO模型( Blocking I/O)相比,提供了更高效的数据传输方式。传统的IO基于流(Stream)和缓冲区(Buffer)操作,而NIO的核心在于通道...

    java8源码-netty-learn:这是一个用于netty学习的工程

    java8 源码 netty-learn 这是一个用于netty学习的工程 ##NIO基础 三大组件 Channel & Buffer channel有点类似于stream,它就是读写数据的双向通道,可以从channel将数据读入buffer,也可以将buffer中的数据写入到...

    [Java4Android 33_Java当中的IO(二)

    Java NIO(New IO)是自Java 1.4引入的,提供了一种新的IO模型,与传统的IO相比,NIO是非阻塞的,并且支持选择器(Selector),使得多路复用变得更加高效。`Channel`、`Buffer`和`Selector`是NIO的核心组件。 9. *...

    读大文件Java

    Java NIO(非阻塞I/O)提供了一种新的I/O模型,通过通道(Channel)和缓冲区(Buffer)进行数据传输。`FileChannel`可以用来读写大文件,配合`MappedByteBuffer`实现内存映射文件,性能更优。 ```java FileChannel fc...

    java io 系列操作代码练习 Java学习资料

    Java IO体系主要包括字节流(Byte Stream)和字符流(Character Stream),以及缓冲流(Buffered Stream)、转换流(Convert Stream)、对象流(Object Stream)等。其中,字节流处理单字节的数据,如InputStream和...

    java io读取文件

    - Java的`MappedByteBuffer`类允许将文件映射到内存,使得文件操作如同访问内存一样快速,适合处理大型文件。 9. **大数据量文件读取策略** - **分块读取**:对于大文件,不一次性加载到内存,而是按需分块读取。...

    Java的io的应用

    Java的IO(Input/Output)是Java编程中的一个重要领域,主要负责数据的输入与输出操作。在Java中,IO API提供了丰富的类和接口,使得开发者能够有效地读取、写入数据,无论是从文件、网络还是内存。下面我们将深入...

    Java流和文件总结(二)

    在Java编程语言中,流(Stream)和文件操作是核心概念,它们对于处理输入和输出数据至关重要。在本文中,我们将深入探讨Java流和文件处理的一些关键知识点。 首先,流是Java中的一个抽象概念,它代表了数据的有序...

    java技术分享

    OpenHFT是一个专注于高性能Java框架的开源项目,提供了一系列工具和技术,以支持低延迟和高吞吐量的应用场景,尤其适用于金融领域的高频交易。 - **HugeCollections**:该项目提供了一组利用非堆内存实现的集合类,...

    java 文件处理 工具类(csdn)————程序.pdf

    当处理内存限制或性能敏感的应用时,还可以利用NIO(New I/O)的特性,如`FileChannel`和`MappedByteBuffer`进行内存映射文件操作,这允许直接在磁盘和内存之间传输数据,而无需经过CPU。 总的来说,Java提供了多种...

    IO流的操作

    - 节点流(Node Stream):直接与特定的数据源或目的地关联,如FileInputStream与文件关联。 - 处理流(Filter Stream):不直接与数据源或目的地关联,而是包裹在节点流之上,提供额外的功能,如...

    ULima_JAVA_FileReading:Java程式2015 I

    - Java的 `MappedByteBuffer` 允许将文件直接映射到内存,提高读写性能,适用于大数据处理。 9. **流的关闭**: - 为了防止资源泄漏,使用完流之后必须关闭。Java 7引入了 try-with-resources 语句,可以自动关闭...

    java-io-examples

    5. 缓冲区:BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter提供了缓冲功能,减少与底层资源的交互次数,提高性能。 6. 转换流:InputStreamReader和OutputStreamWriter作为字节流与...

    farm:文件分析与研究模块

    "Farm: 文件分析与研究模块" 是一个专为处理和分析文件数据而设计的Java项目。这个模块可能包含了用于读取、解析、处理和展示文件信息的各种工具和类库,适用于大数据分析、日志处理、内容挖掘等多种场景。在Java...

Global site tag (gtag.js) - Google Analytics