From b0d8752f3d57fe8683c792bd18d89aad3aa7677f Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Wed, 22 Sep 2021 16:37:42 +0800 Subject: [PATCH] =?UTF-8?q?perf[protocol]:=20=E4=BC=98=E5=8C=96protocol?= =?UTF-8?q?=E7=9A=84=E6=80=A7=E8=83=BD=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zfoo/protocol/SpeedTest.java | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java b/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java index bb214640..d467a3ba 100644 --- a/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java +++ b/protocol/src/test/java/com/zfoo/protocol/SpeedTest.java @@ -15,8 +15,8 @@ package com.zfoo.protocol; import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; +import com.esotericsoftware.kryo.io.ByteBufferInput; +import com.esotericsoftware.kryo.io.ByteBufferOutput; import com.google.protobuf.ByteString; import com.google.protobuf.CodedOutputStream; import com.zfoo.protocol.collection.ArrayUtils; @@ -26,6 +26,7 @@ import com.zfoo.protocol.util.StringUtils; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.UnpooledHeapByteBuf; +import io.netty.buffer.UnpooledUnsafeHeapByteBuf; import org.junit.Ignore; import org.junit.Test; @@ -93,7 +94,12 @@ public class SpeedTest { @Ignore @Test public void zfooTest() { - ByteBuf buffer = new UnpooledHeapByteBuf(ByteBufAllocator.DEFAULT, 100, 1_0000); + // netty的ByteBuf做了更多的安全检测,java自带的ByteBuffer并没有做安全检测,为了公平,把不需要的检测去掉 + // java通过ByteBuffer.allocate(1024 * 8)构造出来的是使用了unsafe的HeapByteBuffer,为了公平,使用netty中带有unsafe操作的UnpooledUnsafeHeapByteBuf + System.setProperty("io.netty.buffer.checkAccessible", "false"); + System.setProperty("io.netty.buffer.checkBounds", "false"); + + ByteBuf buffer = new UnpooledUnsafeHeapByteBuf(ByteBufAllocator.DEFAULT, 100, 1_0000); // 序列化和反序列化简单对象 long startTime = System.currentTimeMillis(); @@ -131,52 +137,54 @@ public class SpeedTest { public void kryoTest() { var kryo = kryos.get(); - var output = new Output(1_0000); - var input = new Input(); + var buffer = ByteBuffer.allocate(1024 * 8); // 序列化和反序列化简单对象 long startTime = System.currentTimeMillis(); for (int i = 0; i < benchmark; i++) { - output.reset(); - input.reset(); + buffer.clear(); + var output = new ByteBufferOutput(buffer); kryo.writeObject(output, simpleObject); - input.setBuffer(output.getBuffer()); - input.setLimit(output.position()); + output.flush(); + buffer.flip(); + var input = new ByteBufferInput(buffer); var mess = kryo.readObject(input, SimpleObject.class); } - System.out.println(StringUtils.format("[kryo] [简单对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), output.position(), System.currentTimeMillis() - startTime)); + System.out.println(StringUtils.format("[kryo] [简单对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.limit(), System.currentTimeMillis() - startTime)); // 序列化和反序列化常规对象 startTime = System.currentTimeMillis(); for (int i = 0; i < benchmark; i++) { - output.reset(); - input.reset(); + buffer.clear(); + var output = new ByteBufferOutput(buffer); kryo.writeObject(output, normalObject); - input.setBuffer(output.getBuffer()); - input.setLimit(output.position()); + output.flush(); + buffer.flip(); + var input = new ByteBufferInput(buffer); var mess = kryo.readObject(input, NormalObject.class); } - System.out.println(StringUtils.format("[kryo] [常规对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), output.position(), System.currentTimeMillis() - startTime)); + System.out.println(StringUtils.format("[kryo] [常规对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.limit(), System.currentTimeMillis() - startTime)); // 序列化和反序列化复杂对象 startTime = System.currentTimeMillis(); for (int i = 0; i < benchmark; i++) { - output.reset(); - input.reset(); + buffer.clear(); + var output = new ByteBufferOutput(buffer); kryo.writeObject(output, complexObject); - input.setBuffer(output.getBuffer()); - input.setLimit(output.position()); + output.flush(); + buffer.flip(); + var input = new ByteBufferInput(buffer); var mess = kryo.readObject(input, ComplexObject.class); } - System.out.println(StringUtils.format("[kryo] [复杂对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), output.position(), System.currentTimeMillis() - startTime)); + System.out.println(StringUtils.format("[kryo] [复杂对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.limit(), System.currentTimeMillis() - startTime)); } @Ignore