KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm working on some SocketChannel -to- SocketChannel code which will do best with a direct byte buffer--long lived and large (tens to hundreds of megabytes per connection.) While hashing out the exact loop structure with FileChannel s, I ran some micro-benchmarks on ByteBuffer.allocate() vs. ByteBuffer.allocateDirect() performance. There was a surprise in the results that I can't really explain. In the below graph, there is a very pronounced cliff at the 256KB and 512KB for the ByteBuffer.allocate() transfer implementation--the performance drops by ~50%! There also seem sto be a smaller performance cliff for the ByteBuffer.allocateDirect() . (The %-gain series helps to visualize these changes.) Buffer Size (bytes) versus Time (MS) Why the odd performance curve differential between ByteBuffer.allocate() and ByteBuffer.allocateDirect() ? What exactly is going on behind the curtain? It very well maybe hardware and OS dependent, so here are those details: MacBook Pro w/ Dual-core Core 2 CPU Intel X25M SSD drive OSX 10.6.4 Source code, by request: 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
Tags (comma-separated)
Save Edits
Cancel