package com.lambdaworks.redis.protocol; import java.util.ArrayDeque; import org.openjdk.jmh.annotations.*; import com.lambdaworks.redis.ClientOptions; import com.lambdaworks.redis.codec.ByteArrayCodec; import com.lambdaworks.redis.output.ValueOutput; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelPromise; import io.netty.channel.embedded.EmbeddedChannel; /** * Benchmark for {@link CommandHandler}. Test cases: * <ul> * <li>user command writes</li> * <li>netty (in-eventloop) writes</li> * </ul> * * @author Mark Paluch */ @State(Scope.Benchmark) public class CommandHandlerBenchmark { private final static ByteArrayCodec CODEC = new ByteArrayCodec(); private final static ClientOptions CLIENT_OPTIONS = ClientOptions.create(); private final static EmptyContext CHANNEL_HANDLER_CONTEXT = new EmptyContext(); private final static byte[] KEY = "key".getBytes(); private final static ChannelFuture EMPTY = new EmptyFuture(); private CommandHandler commandHandler; private Command command; @Setup public void setup() { commandHandler = new CommandHandler(CLIENT_OPTIONS, EmptyClientResources.INSTANCE, new ArrayDeque<>(512)); command = new Command(CommandType.GET, new ValueOutput<>(CODEC), new CommandArgs(CODEC).addKey(KEY)); commandHandler.setState(CommandHandler.LifecycleState.CONNECTED); commandHandler.channel = new MyLocalChannel(); } @TearDown(Level.Iteration) public void tearDown() { commandHandler.reset(); } @Benchmark public void measureUserWrite() { commandHandler.write(command); } @Benchmark public void measureNettyWrite() throws Exception { commandHandler.write(CHANNEL_HANDLER_CONTEXT, command, null); } private final static class MyLocalChannel extends EmbeddedChannel { @Override public boolean isActive() { return true; } @Override public boolean isOpen() { return true; } @Override public ChannelFuture write(Object msg) { return EMPTY; } @Override public ChannelFuture write(Object msg, ChannelPromise promise) { return promise; } @Override public ChannelFuture writeAndFlush(Object msg) { return EMPTY; } @Override public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) { return promise; } } }