[
https://issues.apache.org/jira/browse/JCS-109?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Thomas Vandahl resolved JCS-109.
--------------------------------
Resolution: Fixed
Fix Version/s: jcs-2.0.0
Fixed in SVN. Thanks for the patch.
> poor performance of BlockDisk.write(Serializable object)
> --------------------------------------------------------
>
> Key: JCS-109
> URL: https://issues.apache.org/jira/browse/JCS-109
> Project: Commons JCS
> Issue Type: Improvement
> Affects Versions: jcs-2.0.0
> Reporter: Xiong LIU
> Assignee: Thomas Vandahl
> Labels: performance
> Fix For: jcs-2.0.0
>
>
> The performance of BlockDisk.write(Serializable object) is poor, because
> current implementation involves much ByteBuffer allocation and byte array
> allocation and memory copy.
> The following is my implementation, which only needs to allocate
> HEADER_SIZE_BYTES. A benchmark can be done to show the performance gain.
> protected int[] write(Serializable object) throws IOException {
> // serialize the object
> byte[] data = elementSerializer.serialize(object);
> // figure out how many blocks we need.
> int numBlocksNeeded = calculateTheNumberOfBlocksNeeded(data);
> // allocate blocks
> int[] blocks = allocateBlocks(numBlocksNeeded);
> int offset = 0;
> final int maxChunkSize = blockSizeBytes - HEADER_SIZE_BYTES;
> ByteBuffer headerBuffer = ByteBuffer.allocate(HEADER_SIZE_BYTES);
> for (int i = 0; i < numBlocksNeeded; i++) {
> headerBuffer.clear();
> int length = Math.min(maxChunkSize, data.length - offset);
> headerBuffer.putInt(length);
> ByteBuffer dataBuffer = ByteBuffer.wrap(data, offset, length);
> long position = calculateByteOffsetForBlock(blocks[i]);
> // write the header
> headerBuffer.flip();
> int written = fc.write(headerBuffer, position);
> assert written == HEADER_SIZE_BYTES;
> //write the data
> written = fc.write(dataBuffer, position + HEADER_SIZE_BYTES);
> assert written == length;
> offset += length;
> }
> fc.force(false);
> return blocks;
> }
> private int[] allocateBlocks(int numBlocksNeeded) {
> assert numBlocksNeeded >= 1;
> int[] blocks = new int[numBlocksNeeded];
> // get them from the empty list or take the next one
> for (int i = 0; i < numBlocksNeeded; i++) {
> Integer emptyBlock = emptyBlocks.takeFirst();
> if (emptyBlock == null) {
> emptyBlock = numberOfBlocks.getAndIncrement();
> }
> blocks[i] = emptyBlock;
> }
> return blocks;
> }
--
This message was sent by Atlassian JIRA
(v6.1.5#6160)