comparison src/org/tmatesoft/hg/internal/RevlogStream.java @ 655:bcbcc318f250

Performance: reuse unzip output buffer
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 04 Jul 2013 18:36:38 +0200
parents 1deea2f33218
children ae2d439fbed3
comparison
equal deleted inserted replaced
654:12a4f60ea972 655:bcbcc318f250
24 import java.io.File; 24 import java.io.File;
25 import java.io.IOException; 25 import java.io.IOException;
26 import java.lang.ref.Reference; 26 import java.lang.ref.Reference;
27 import java.lang.ref.ReferenceQueue; 27 import java.lang.ref.ReferenceQueue;
28 import java.lang.ref.SoftReference; 28 import java.lang.ref.SoftReference;
29 import java.nio.ByteBuffer;
29 import java.util.ArrayList; 30 import java.util.ArrayList;
30 import java.util.List; 31 import java.util.List;
31 import java.util.zip.Inflater; 32 import java.util.zip.Inflater;
32 33
33 import org.tmatesoft.hg.core.HgIOException; 34 import org.tmatesoft.hg.core.HgIOException;
630 // 631 //
631 // next are transient values, for range() use only 632 // next are transient values, for range() use only
632 private final Inflater inflater = new Inflater(); 633 private final Inflater inflater = new Inflater();
633 // can share buffer between instances of InflaterDataAccess as I never read any two of them in parallel 634 // can share buffer between instances of InflaterDataAccess as I never read any two of them in parallel
634 private final byte[] inflaterBuffer = new byte[10 * 1024]; // TODO [post-1.1] consider using DAP.DEFAULT_FILE_BUFFER 635 private final byte[] inflaterBuffer = new byte[10 * 1024]; // TODO [post-1.1] consider using DAP.DEFAULT_FILE_BUFFER
636 private final ByteBuffer inflaterOutBuffer = ByteBuffer.allocate(inflaterBuffer.length * 2);
635 private final byte[] nodeidBuf = new byte[20]; 637 private final byte[] nodeidBuf = new byte[20];
636 // revlog record fields 638 // revlog record fields
637 private long offset; 639 private long offset;
638 @SuppressWarnings("unused") 640 @SuppressWarnings("unused")
639 private int flags; 641 private int flags;
739 userDataAccess = new DataAccess(); // empty 741 userDataAccess = new DataAccess(); // empty
740 } else { 742 } else {
741 final byte firstByte = streamDataAccess.readByte(); 743 final byte firstByte = streamDataAccess.readByte();
742 if (firstByte == 0x78 /* 'x' */) { 744 if (firstByte == 0x78 /* 'x' */) {
743 inflater.reset(); 745 inflater.reset();
744 userDataAccess = new InflaterDataAccess(streamDataAccess, streamOffset, compressedLen, isPatch(i) ? -1 : actualLen, inflater, inflaterBuffer); 746 userDataAccess = new InflaterDataAccess(streamDataAccess, streamOffset, compressedLen, isPatch(i) ? -1 : actualLen, inflater, inflaterBuffer, inflaterOutBuffer);
745 } else if (firstByte == 0x75 /* 'u' */) { 747 } else if (firstByte == 0x75 /* 'u' */) {
746 userDataAccess = new FilterDataAccess(streamDataAccess, streamOffset+1, compressedLen-1); 748 userDataAccess = new FilterDataAccess(streamDataAccess, streamOffset+1, compressedLen-1);
747 } else { 749 } else {
748 // XXX Python impl in fact throws exception when there's not 'x', 'u' or '0' but I don't see reason not to return data as is 750 // XXX Python impl in fact throws exception when there's not 'x', 'u' or '0' but I don't see reason not to return data as is
749 // 751 //