package com.lambdaworks.redis.protocol; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.GatheringByteChannel; import java.nio.channels.ScatteringByteChannel; import java.nio.charset.Charset; import com.lambdaworks.redis.protocol.CommandArgs.ExperimentalByteArrayCodec; import org.openjdk.jmh.annotations.*; import com.lambdaworks.redis.codec.ByteArrayCodec; import com.lambdaworks.redis.codec.RedisCodec; import com.lambdaworks.redis.codec.Utf8StringCodec; import com.lambdaworks.redis.output.ValueOutput; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.ByteBufProcessor; /** * Benchmark for {@link Command}. Test cases: * <ul> * <li>Create commands using String and ByteArray codecs</li> * <li>Encode commands using String and ByteArray codecs</li> * </ul> * * @author Mark Paluch */ @State(Scope.Benchmark) public class CommandBenchmark { private final static ByteArrayCodec BYTE_ARRAY_CODEC = new ByteArrayCodec(); private final static ExperimentalByteArrayCodec BYTE_ARRAY_CODEC2 = ExperimentalByteArrayCodec.INSTANCE; private final static Utf8StringCodec STRING_CODEC = new Utf8StringCodec(); private final static EmptyByteBuf DUMMY_BYTE_BUF = new EmptyByteBuf(); private final static String KEY = "key"; private final static byte[] BYTE_KEY = "key".getBytes(); @Benchmark public void createCommandUsingByteArrayCodec() { createCommand(BYTE_KEY, BYTE_ARRAY_CODEC); } @Benchmark public void createCommandUsingStringCodec() { createCommand(KEY, STRING_CODEC); } @Benchmark public void encodeCommandUsingByteArrayCodec() { createCommand(BYTE_KEY, BYTE_ARRAY_CODEC).encode(DUMMY_BYTE_BUF); } @Benchmark public void encodeCommandUsingByteArrayCodec2() { createCommand(BYTE_KEY, BYTE_ARRAY_CODEC2).encode(DUMMY_BYTE_BUF); } @Benchmark public void encodeCommandUsingStringCodec() { createCommand(KEY, STRING_CODEC).encode(DUMMY_BYTE_BUF); } private <K, V, T> Command<K, V, T> createCommand(K key, RedisCodec<K, V> codec) { Command command = new Command(CommandType.GET, new ValueOutput<>(codec), new CommandArgs(codec).addKey(key)); return command; } }