blob: 9fbf24da664f979c5883698dd1f9f63fd64fa3cc [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.cassandra.io.compress;
import org.apache.cassandra.io.util.FileInputStreamPlus;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Collections;
import java.util.concurrent.ThreadLocalRandom;
import static org.apache.cassandra.utils.Clock.Global.nanoTime;
public class CompressorPerformance
{
public static void testPerformances() throws IOException
{
for (ICompressor compressor: new ICompressor[] {
SnappyCompressor.instance, // warm up
DeflateCompressor.instance,
LZ4Compressor.create(Collections.emptyMap()),
SnappyCompressor.instance,
ZstdCompressor.getOrCreate(ZstdCompressor.FAST_COMPRESSION_LEVEL),
ZstdCompressor.getOrCreate(ZstdCompressor.DEFAULT_COMPRESSION_LEVEL)
})
{
for (BufferType in: BufferType.values())
{
if (compressor.supports(in))
{
for (BufferType out: BufferType.values())
{
if (compressor.supports(out))
{
for (int i=0; i<10; ++i)
testPerformance(compressor, in, out);
System.out.println();
}
}
}
}
}
}
static ByteBuffer dataSource;
static int bufLen;
private static void testPerformance(ICompressor compressor, BufferType in, BufferType out) throws IOException
{
int len = dataSource.capacity();
int bufLen = compressor.initialCompressedBufferLength(len);
ByteBuffer input = in.allocate(bufLen);
ByteBuffer output = out.allocate(bufLen);
int checksum = 0;
int count = 100;
long time = nanoTime();
long uncompressedBytes = 0;
long compressedBytes = 0;
for (int i=0; i<count; ++i)
{
output.clear();
compressor.compress(dataSource, output);
uncompressedBytes += dataSource.limit();
compressedBytes += output.position();
// Make sure not optimized away.
checksum += output.get(ThreadLocalRandom.current().nextInt(output.position()));
dataSource.rewind();
}
long timec = nanoTime() - time;
output.flip();
input.put(output);
input.flip();
time = nanoTime();
for (int i=0; i<count; ++i)
{
output.clear();
compressor.uncompress(input, output);
// Make sure not optimized away.
checksum += output.get(ThreadLocalRandom.current().nextInt(output.position()));
input.rewind();
}
long timed = nanoTime() - time;
System.out.format("Compressor %s %s->%s compress %.3f ns/b %.3f mb/s uncompress %.3f ns/b %.3f mb/s ratio %.2f:1.%s\n",
compressor.getClass().getSimpleName(),
in,
out,
1.0 * timec / (count * len),
Math.scalb(1.0e9, -20) * count * len / timec,
1.0 * timed / (count * len),
Math.scalb(1.0e9, -20) * count * len / timed,
((double) uncompressedBytes) / ((double) compressedBytes),
checksum == 0 ? " " : "");
}
public static void main(String[] args) throws IOException
{
try (FileInputStreamPlus fis = new FileInputStreamPlus("CHANGES.txt"))
{
int len = (int)fis.getChannel().size();
dataSource = ByteBuffer.allocateDirect(len);
while (dataSource.hasRemaining()) {
fis.getChannel().read(dataSource);
}
dataSource.flip();
}
testPerformances();
}
}