相关疑难解决方法(0)

为什么ByteBuffer.allocate()和ByteBuffer.allocateDirect()之间的奇怪性能曲线差异

我工作的一些SocketChannel至- SocketChannel代码会做最好用直接字节缓冲区- (几十到几百每个连接的兆字节),长寿命,大而散列出具有确切循环结构FileChannelS,我跑了一些微在基准测试ByteBuffer.allocate()ByteBuffer.allocateDirect()性能.

结果出人意料,我无法解释.在下图中,对于ByteBuffer.allocate()传输实现,在256KB和512KB处有一个非常明显的悬崖- 性能下降了~50%!这似乎也是一个较小的性能悬崖ByteBuffer.allocateDirect().(%-gain系列有助于可视化这些变化.)

缓冲区大小(字节)与时间(MS)

小马差距

为什么奇数性能曲线ByteBuffer.allocate()ByteBuffer.allocateDirect()?之间存在差异? 幕后究竟发生了什么?

它很可能取决于硬件和操作系统,所以这里有以下细节:

  • MacBook Pro配双核Core 2 CPU
  • 英特尔X25M SSD硬盘
  • OSX 10.6.4

源代码,按要求:

package ch.dietpizza.bench;

import static java.lang.String.format;
import static java.lang.System.out;
import static java.nio.ByteBuffer.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;

public class SocketChannelByteBufferExample {
    private static WritableByteChannel target;
    private static ReadableByteChannel source; …
Run Code Online (Sandbox Code Playgroud)

java nio bytebuffer

31
推荐指数
4
解决办法
1万
查看次数

标签 统计

bytebuffer ×1

java ×1

nio ×1