@Benchmark
 public int encodeAligned() {
   // Header
   final long header =
       JournalRecordHeader.makeHeader(JournalRecordTypes.ADD_JOURNAL, expectedEncoderSize);
   this.byteBuffer.putLong(0, header);
   // FileId<CompactCount<Id<RecordType<RecordBytes
   return addJournalRecordEncoder
       .on(byteBuffer, JournalRecordHeader.BYTES)
       .fileId(1)
       .compactCount(1)
       .id(1L)
       .recordType(1)
       .noRecord()
       .encodedLength();
 }
@State(Scope.Thread)
@BenchmarkMode(value = {Mode.Throughput, Mode.SampleTime})
@OutputTimeUnit(TimeUnit.MICROSECONDS)
public class EncodersBench {

  private static final int expectedEncoderSize =
      JournalRecordHeader.BYTES + AddJournalRecordEncoder.expectedSize(0);
  private JournalInternalRecord record;
  private ByteBuffer byteBuffer;
  private AddJournalRecordEncoder addJournalRecordEncoder;
  private ActiveMQBuffer outBuffer;

  public static void main(String[] args) throws RunnerException {
    final Options opt =
        new OptionsBuilder()
            .include(EncodersBench.class.getSimpleName())
            .addProfiler(GCProfiler.class)
            .warmupIterations(5)
            .measurementIterations(5)
            .forks(1)
            .build();
    new Runner(opt).run();
  }

  @Setup
  public void init() {
    this.byteBuffer = ByteBuffer.allocateDirect(expectedEncoderSize);
    this.byteBuffer.order(ByteOrder.nativeOrder());
    this.addJournalRecordEncoder = new AddJournalRecordEncoder();

    this.record = new JournalAddRecord(true, 1, (byte) 1, ZeroEncodingSupport.Instance);
    this.record.setFileID(1);
    this.record.setCompactCount((short) 1);
    this.outBuffer =
        new ChannelBufferWrapper(
            Unpooled.directBuffer(this.record.getEncodeSize(), this.record.getEncodeSize())
                .order(ByteOrder.nativeOrder()));
  }

  @Benchmark
  public int encodeAligned() {
    // Header
    final long header =
        JournalRecordHeader.makeHeader(JournalRecordTypes.ADD_JOURNAL, expectedEncoderSize);
    this.byteBuffer.putLong(0, header);
    // FileId<CompactCount<Id<RecordType<RecordBytes
    return addJournalRecordEncoder
        .on(byteBuffer, JournalRecordHeader.BYTES)
        .fileId(1)
        .compactCount(1)
        .id(1L)
        .recordType(1)
        .noRecord()
        .encodedLength();
  }

  @Benchmark
  public int encodeUnaligned() {
    outBuffer.clear();
    record.encode(outBuffer);
    return record.getEncodeSize();
  }

  @Benchmark
  public int encodeUnalignedWithGarbage() {
    outBuffer.clear();
    final JournalAddRecord addRecord =
        new JournalAddRecord(true, 1, (byte) 1, ZeroEncodingSupport.Instance);
    addRecord.setFileID(1);
    addRecord.setCompactCount((short) 1);
    addRecord.encode(outBuffer);
    return addRecord.getEncodeSize();
  }

  public enum ZeroEncodingSupport implements EncodingSupport {
    Instance;

    @Override
    public int getEncodeSize() {
      return 0;
    }

    @Override
    public void encode(ActiveMQBuffer buffer) {}

    @Override
    public void decode(ActiveMQBuffer buffer) {}
  }
}