`
baoxiaofei
  • 浏览: 33049 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用NIO中ByteBuffer.allocateDirect和ByteBuffer.allocate后性能的确不一样。

    博客分类:
  • JAVA
 
阅读更多
package com.bxf.NIOTest;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class allocateDirectTest {
public allocateDirectTest(){}

String sfin = "K:\\tmp\\FileIn.txt";
String sfou = "K:\\tmp\\FileOut.txt";
String sfou2 = "K:\\tmp\\FileOut2.txt";

public void copyFileByAllocDir() throws Exception{
FileInputStream fin = new FileInputStream(sfin);
FileChannel fcin = fin.getChannel();

FileOutputStream fout = new FileOutputStream(sfou);
FileChannel fcout = fout.getChannel();

ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

long startTime = System.currentTimeMillis();
while(true){
buffer.clear();
int r = fcin.read(buffer);

if(r == -1)
break;
buffer.flip();
fcout.write(buffer);
}
long endTime = System.currentTimeMillis();
System.out.println("By copyFileByAllocDir Use time : " + (endTime - startTime));
}

// 经测试使用ByteBuffer.allocateDirect(1024)的确要比使用
// ByteBuffer.allocate(1024)快!
public void copyFileByAlloc() throws Exception{
FileInputStream fin = new FileInputStream(sfin);
FileChannel fcin = fin.getChannel();

FileOutputStream fout2 = new FileOutputStream(sfou2);
FileChannel fcout2 = fout2.getChannel();

ByteBuffer buffer = ByteBuffer.allocate(1024);
long startTime = System.currentTimeMillis();
while(true){
buffer.clear();
int r = fcin.read(buffer);

if(r == -1)
break;
buffer.flip();
fcout2.write(buffer);
}
long endTime = System.currentTimeMillis();
System.out.println("By copyFileByAlloc Use time : " + (endTime - startTime));

}
}
// 第一次测试结果:
// By copyFileByAllocDir Use time : 50
// By copyFileByAlloc Use time : 69

// 第二次测试结果:
// By copyFileByAllocDir Use time : 52
// By copyFileByAlloc Use time : 58

如果将buffer调大到:100*1024,差距就更明显了:
//By copyFileByAllocDir Use time : 3
//By copyFileByAlloc Use time : 68

//By copyFileByAllocDir Use time : 2
//By copyFileByAlloc Use time : 60
分享到:
评论

相关推荐

    Android中的ByteBuffer解析

    2. **直接缓冲区**:对于性能敏感的应用,可以使用`ByteBuffer.allocateDirect(int capacity)`创建直接缓冲区,它直接在物理内存中分配空间,减少了Java对象头的开销,但可能涉及内存复制。 三、ByteBuffer的主要...

    Java NIO学习笔记——ByteBuffer用法

    2. 使用`ByteBuffer.allocateDirect(int capacity)`:分配一个直接缓冲区,直接缓冲区通常在物理内存中,而不是Java堆上,能提高性能,尤其在处理大文件时。 3. 使用`ByteBuffer.wrap(byte[] array)`:将已有的字节...

    java.nio API详解

    ByteBuffer是NIO中的关键类,它与其他类型的Buffer(如CharBuffer、IntBuffer等)一样,具有capacity、limit和position属性。但是,ByteBuffer与Channel和Selector的交互更加紧密。例如,可以从FileChannel中读取...

    android开发进阶之NIO非阻塞包

    综上所述,NIO是非阻塞式I/O模型的重要实现,通过使用`Channel`、`Selector`和`ByteBuffer`等核心组件,能够显著提高Android应用程序在网络通信方面的性能。对于需要处理高并发请求的应用场景尤为适用。

    学习笔记 java\CoreJava笔记\CoreJava_day21

    在`CoreJava_day21`的学习笔记中,主要探讨了Java中的NIO(New I/O)包及其关键类和接口,包括`ByteBuffer`、`FileChannel`以及网络编程中常用的`ServerSocket`和`Socket`等。NIO自JDK 1.4引入以来,因其高效性和...

    Android开发进阶之NIO非阻塞包[定义].pdf

    实例化ByteBuffer有两种主要方式:allocate()用于在堆上分配内存,而allocateDirect()则是在堆外直接分配,适用于需要高效访问和多次复用的情况。ByteBuffer还可以通过wrap()方法从byte数组中创建,或者通过put()...

    Java中的缓冲区(直接缓冲区、非直接缓冲区等).docx

    ### Java中的缓冲区详解 #### 一、缓冲区概述 ...通过合理地使用直接缓冲区和非直接缓冲区,开发者可以显著提高应用程序的性能。了解缓冲区的基本概念、特性和使用方法对于任何Java开发者来说都是非常重要的。

    Java_NIO_API详解

    - `allocateDirect(int capacity)`:创建一个Direct ByteBuffer,它通常在内存映射文件或直接I/O操作中性能更优。 - `wrap(byte[] array)`:将已存在的字节数组包装成ByteBuffer。 - `wrap(byte[] array, int offset...

    Java Nio ibm技术文档

    ### Java NIO (New Input/Output):IBM技术文档概览...同时,NIO库还提供了一系列高级特性,如异步I/O和直接缓冲区,进一步增强了Java在高性能I/O处理方面的实力。希望本文档能够成为Java开发者学习NIO的重要参考资料。

    Java NIO.pdf

    ### Java NIO 相关知识点 #### 一、Java NIO 概述 ...以上内容总结了《Java NIO》一书中关于 Java NIO 的核心概念、技术细节以及实际应用案例,旨在帮助开发者更好地理解和运用 Java NIO 来提高程序的性能和可靠性。

    细说Java NIO

    2. **创建缓冲区**:`java.nio.ByteBuffer`是最常用的缓冲区类型,可以通过`allocate()`、`allocateDirect()`等方式创建。 3. **读写数据**:通过`channel.read(buffer)`和`channel.write(buffer)`方法在通道与缓冲...

    【IT十八掌徐培成】Java基础第26天-08.DirectByteBuffer2.zip

    - **内存泄漏**:由于直接缓冲区不参与垃圾回收,使用后必须确保释放,否则可能导致内存泄漏。 - **内存碎片**:长期使用直接缓冲区可能导致内存碎片,影响系统性能。 - **容量限制**:直接缓冲区的大小受限于JVM...

    java读取大文件大全

    ### Java读取大文件技术详解 #### 一、引言 在Java开发中,处理大文件是一...通过合理的代码设计和性能优化策略,可以极大地提高处理大文件的速度。希望本文能够帮助开发者更好地理解和应用Java中的大文件读取技术。

    java NOI 学习

    虽然对于大多数日常应用场景而言,这种模型已经足够高效和方便,但在一些高性能或服务器端的应用场景中,传统的阻塞式IO模型存在明显的性能瓶颈。 随着互联网的发展,特别是服务器端应用程序的需求越来越复杂,对IO...

    Java NIO核心概念总结篇

    - **创建缓冲区**:使用静态工厂方法创建缓冲区实例,例如 `ByteBuffer.allocate(1024)` 创建一个容量为 1024 字节的 `ByteBuffer`。 - **操作方法**:`put()` 方法用于向缓冲区写入数据,`get()` 方法用于从缓冲...

    Java NIO 主要类和方法(Java NIO中文版 附录C)

    NIO的API设计考虑到了性能和灵活性,通过使用缓冲区和通道,可以让开发者更好地控制数据的处理过程,同时利用缓冲机制实现数据的批量操作。 在Java NIO中,所有的输入输出操作都围绕着Buffer和Channel这两个核心...

    缓冲池 (2).doc.zip

    `allocate()`创建的是堆缓冲区,而`allocateDirect()`创建的是直接缓冲区,后者能避免Java对象与操作系统之间的数据复制,提高性能。 缓冲池的使用有以下优势: 1. **减少内存分配**:预先分配内存,避免频繁的`new...

    java实现超大文件的读写功能

    6. 使用 ByteBuffer 对象将数据写入到文件中。 7. 重复步骤 5 和 6,直到读写完成。 示例代码 以下是一个使用 Java NIO 实现超大文件的读写的示例代码: ```java package cn.gzu.readfile; import java.io.File; ...

    Java NIO(通道+缓冲区+选择器)

    每个Buffer类都有allocate、allocateDirect等方法来创建缓冲区。 3. **直接缓冲区(DirectByteBuffer)**:直接缓冲区不经过Java堆,直接在操作系统层面分配内存,减少了数据复制,提高性能。但并非所有场景都适用,...

Global site tag (gtag.js) - Google Analytics