123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- package SevenZip;
- import java.io.ByteArrayOutputStream;
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- public class LzmaBench
- {
- static final int kAdditionalSize = (1 << 21);
- static final int kCompressedAdditionalSize = (1 << 10);
-
- static class CRandomGenerator
- {
- int A1;
- int A2;
- public CRandomGenerator() { Init(); }
- public void Init() { A1 = 362436069; A2 = 521288629; }
- public int GetRnd()
- {
- return
- ((A1 = 36969 * (A1 & 0xffff) + (A1 >>> 16)) << 16) ^
- ((A2 = 18000 * (A2 & 0xffff) + (A2 >>> 16)));
- }
- };
-
- static class CBitRandomGenerator
- {
- CRandomGenerator RG = new CRandomGenerator();
- int Value;
- int NumBits;
- public void Init()
- {
- Value = 0;
- NumBits = 0;
- }
- public int GetRnd(int numBits)
- {
- int result;
- if (NumBits > numBits)
- {
- result = Value & ((1 << numBits) - 1);
- Value >>>= numBits;
- NumBits -= numBits;
- return result;
- }
- numBits -= NumBits;
- result = (Value << numBits);
- Value = RG.GetRnd();
- result |= Value & (((int)1 << numBits) - 1);
- Value >>>= numBits;
- NumBits = 32 - numBits;
- return result;
- }
- };
-
- static class CBenchRandomGenerator
- {
- CBitRandomGenerator RG = new CBitRandomGenerator();
- int Pos;
- int Rep0;
- public int BufferSize;
- public byte[] Buffer = null;
- public CBenchRandomGenerator() { }
- public void Set(int bufferSize)
- {
- Buffer = new byte[bufferSize];
- Pos = 0;
- BufferSize = bufferSize;
- }
- int GetRndBit() { return RG.GetRnd(1); }
- int GetLogRandBits(int numBits)
- {
- int len = RG.GetRnd(numBits);
- return RG.GetRnd((int)len);
- }
- int GetOffset()
- {
- if (GetRndBit() == 0)
- return GetLogRandBits(4);
- return (GetLogRandBits(4) << 10) | RG.GetRnd(10);
- }
- int GetLen1() { return RG.GetRnd(1 + (int)RG.GetRnd(2)); }
- int GetLen2() { return RG.GetRnd(2 + (int)RG.GetRnd(2)); }
- public void Generate()
- {
- RG.Init();
- Rep0 = 1;
- while (Pos < BufferSize)
- {
- if (GetRndBit() == 0 || Pos < 1)
- Buffer[Pos++] = (byte)(RG.GetRnd(8));
- else
- {
- int len;
- if (RG.GetRnd(3) == 0)
- len = 1 + GetLen1();
- else
- {
- do
- Rep0 = GetOffset();
- while (Rep0 >= Pos);
- Rep0++;
- len = 2 + GetLen2();
- }
- for (int i = 0; i < len && Pos < BufferSize; i++, Pos++)
- Buffer[Pos] = Buffer[Pos - Rep0];
- }
- }
- }
- };
-
- static class CrcOutStream extends java.io.OutputStream
- {
- public CRC CRC = new CRC();
-
- public void Init()
- {
- CRC.Init();
- }
- public int GetDigest()
- {
- return CRC.GetDigest();
- }
- public void write(byte[] b)
- {
- CRC.Update(b);
- }
- public void write(byte[] b, int off, int len)
- {
- CRC.Update(b, off, len);
- }
- public void write(int b)
- {
- CRC.UpdateByte(b);
- }
- };
- static class MyOutputStream extends java.io.OutputStream
- {
- byte[] _buffer;
- int _size;
- int _pos;
-
- public MyOutputStream(byte[] buffer)
- {
- _buffer = buffer;
- _size = _buffer.length;
- }
-
- public void reset()
- {
- _pos = 0;
- }
-
- public void write(int b) throws IOException
- {
- if (_pos >= _size)
- throw new IOException("Error");
- _buffer[_pos++] = (byte)b;
- }
-
- public int size()
- {
- return _pos;
- }
- };
- static class MyInputStream extends java.io.InputStream
- {
- byte[] _buffer;
- int _size;
- int _pos;
-
- public MyInputStream(byte[] buffer, int size)
- {
- _buffer = buffer;
- _size = size;
- }
-
- public void reset()
- {
- _pos = 0;
- }
-
- public int read()
- {
- if (_pos >= _size)
- return -1;
- return _buffer[_pos++] & 0xFF;
- }
- };
-
- static class CProgressInfo implements ICodeProgress
- {
- public long ApprovedStart;
- public long InSize;
- public long Time;
- public void Init()
- { InSize = 0; }
- public void SetProgress(long inSize, long outSize)
- {
- if (inSize >= ApprovedStart && InSize == 0)
- {
- Time = System.currentTimeMillis();
- InSize = inSize;
- }
- }
- }
- static final int kSubBits = 8;
-
- static int GetLogSize(int size)
- {
- for (int i = kSubBits; i < 32; i++)
- for (int j = 0; j < (1 << kSubBits); j++)
- if (size <= ((1) << i) + (j << (i - kSubBits)))
- return (i << kSubBits) + j;
- return (32 << kSubBits);
- }
-
- static long MyMultDiv64(long value, long elapsedTime)
- {
- long freq = 1000; // ms
- long elTime = elapsedTime;
- while (freq > 1000000)
- {
- freq >>>= 1;
- elTime >>>= 1;
- }
- if (elTime == 0)
- elTime = 1;
- return value * freq / elTime;
- }
-
- static long GetCompressRating(int dictionarySize, long elapsedTime, long size)
- {
- long t = GetLogSize(dictionarySize) - (18 << kSubBits);
- long numCommandsForOne = 1060 + ((t * t * 10) >> (2 * kSubBits));
- long numCommands = (long)(size) * numCommandsForOne;
- return MyMultDiv64(numCommands, elapsedTime);
- }
-
- static long GetDecompressRating(long elapsedTime, long outSize, long inSize)
- {
- long numCommands = inSize * 220 + outSize * 20;
- return MyMultDiv64(numCommands, elapsedTime);
- }
-
- static long GetTotalRating(
- int dictionarySize,
- long elapsedTimeEn, long sizeEn,
- long elapsedTimeDe,
- long inSizeDe, long outSizeDe)
- {
- return (GetCompressRating(dictionarySize, elapsedTimeEn, sizeEn) +
- GetDecompressRating(elapsedTimeDe, inSizeDe, outSizeDe)) / 2;
- }
-
- static void PrintValue(long v)
- {
- String s = "";
- s += v;
- for (int i = 0; i + s.length() < 6; i++)
- System.out.print(" ");
- System.out.print(s);
- }
-
- static void PrintRating(long rating)
- {
- PrintValue(rating / 1000000);
- System.out.print(" MIPS");
- }
-
- static void PrintResults(
- int dictionarySize,
- long elapsedTime,
- long size,
- boolean decompressMode, long secondSize)
- {
- long speed = MyMultDiv64(size, elapsedTime);
- PrintValue(speed / 1024);
- System.out.print(" KB/s ");
- long rating;
- if (decompressMode)
- rating = GetDecompressRating(elapsedTime, size, secondSize);
- else
- rating = GetCompressRating(dictionarySize, elapsedTime, size);
- PrintRating(rating);
- }
-
- static public int LzmaBenchmark(int numIterations, int dictionarySize) throws Exception
- {
- if (numIterations <= 0)
- return 0;
- if (dictionarySize < (1 << 18))
- {
- System.out.println("\nError: dictionary size for benchmark must be >= 18 (256 KB)");
- return 1;
- }
- System.out.print("\n Compressing Decompressing\n\n");
-
- SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder();
- SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
-
- if (!encoder.SetDictionarySize(dictionarySize))
- throw new Exception("Incorrect dictionary size");
-
- int kBufferSize = dictionarySize + kAdditionalSize;
- int kCompressedBufferSize = (kBufferSize / 2) + kCompressedAdditionalSize;
-
- ByteArrayOutputStream propStream = new ByteArrayOutputStream();
- encoder.WriteCoderProperties(propStream);
- byte[] propArray = propStream.toByteArray();
- decoder.SetDecoderProperties(propArray);
-
- CBenchRandomGenerator rg = new CBenchRandomGenerator();
- rg.Set(kBufferSize);
- rg.Generate();
- CRC crc = new CRC();
- crc.Init();
- crc.Update(rg.Buffer, 0, rg.BufferSize);
-
- CProgressInfo progressInfo = new CProgressInfo();
- progressInfo.ApprovedStart = dictionarySize;
-
- long totalBenchSize = 0;
- long totalEncodeTime = 0;
- long totalDecodeTime = 0;
- long totalCompressedSize = 0;
-
- MyInputStream inStream = new MyInputStream(rg.Buffer, rg.BufferSize);
- byte[] compressedBuffer = new byte[kCompressedBufferSize];
- MyOutputStream compressedStream = new MyOutputStream(compressedBuffer);
- CrcOutStream crcOutStream = new CrcOutStream();
- MyInputStream inputCompressedStream = null;
- int compressedSize = 0;
- for (int i = 0; i < numIterations; i++)
- {
- progressInfo.Init();
- inStream.reset();
- compressedStream.reset();
- encoder.Code(inStream, compressedStream, -1, -1, progressInfo);
- long encodeTime = System.currentTimeMillis() - progressInfo.Time;
-
- if (i == 0)
- {
- compressedSize = compressedStream.size();
- inputCompressedStream = new MyInputStream(compressedBuffer, compressedSize);
- }
- else if (compressedSize != compressedStream.size())
- throw (new Exception("Encoding error"));
-
- if (progressInfo.InSize == 0)
- throw (new Exception("Internal ERROR 1282"));
- long decodeTime = 0;
- for (int j = 0; j < 2; j++)
- {
- inputCompressedStream.reset();
- crcOutStream.Init();
-
- long outSize = kBufferSize;
- long startTime = System.currentTimeMillis();
- if (!decoder.Code(inputCompressedStream, crcOutStream, outSize))
- throw (new Exception("Decoding Error"));;
- decodeTime = System.currentTimeMillis() - startTime;
- if (crcOutStream.GetDigest() != crc.GetDigest())
- throw (new Exception("CRC Error"));
- }
- long benchSize = kBufferSize - (long)progressInfo.InSize;
- PrintResults(dictionarySize, encodeTime, benchSize, false, 0);
- System.out.print(" ");
- PrintResults(dictionarySize, decodeTime, kBufferSize, true, compressedSize);
- System.out.println();
-
- totalBenchSize += benchSize;
- totalEncodeTime += encodeTime;
- totalDecodeTime += decodeTime;
- totalCompressedSize += compressedSize;
- }
- System.out.println("---------------------------------------------------");
- PrintResults(dictionarySize, totalEncodeTime, totalBenchSize, false, 0);
- System.out.print(" ");
- PrintResults(dictionarySize, totalDecodeTime,
- kBufferSize * (long)numIterations, true, totalCompressedSize);
- System.out.println(" Average");
- return 0;
- }
- }
|