diff --git a/protocol/pom.xml b/protocol/pom.xml
index 50dc7a9b9..3adf9eba7 100644
--- a/protocol/pom.xml
+++ b/protocol/pom.xml
@@ -128,6 +128,19 @@
test
+
+ org.furyio
+ fury-core
+ 0.2.1
+ test
+
+
+ slf4j-api
+ org.slf4j
+
+
+
+
junit
junit
diff --git a/protocol/src/main/java/com/zfoo/protocol/buffer/CustomByteBuf.java b/protocol/src/main/java/com/zfoo/protocol/buffer/CustomByteBuf.java
index 3a9469beb..3badf036d 100644
--- a/protocol/src/main/java/com/zfoo/protocol/buffer/CustomByteBuf.java
+++ b/protocol/src/main/java/com/zfoo/protocol/buffer/CustomByteBuf.java
@@ -18,7 +18,7 @@
import java.nio.ByteBuffer;
/**
- * 自定义私有协议格式,可以针对性的对存在性能瓶颈的数据结构做特定优化
+ * 自定义协议格式,可以针对某些特定场景对做特定优化
*
* @author godotg
*/
diff --git a/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java b/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java
index 7ec4d80cf..cf56c9818 100644
--- a/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java
+++ b/protocol/src/test/java/com/zfoo/protocol/BenchmarkTesting.java
@@ -24,6 +24,11 @@
import com.zfoo.protocol.generate.GenerateOperation;
import com.zfoo.protocol.packet.*;
import com.zfoo.protocol.util.StringUtils;
+import io.fury.Fury;
+import io.fury.ThreadLocalFury;
+import io.fury.ThreadSafeFury;
+import io.fury.config.Language;
+import io.fury.memory.MemoryBuffer;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.UnpooledHeapByteBuf;
@@ -63,6 +68,7 @@ public void singleThreadBenchmarks() {
System.out.println(StringUtils.format("[单线程性能测试-->[benchmark:{}]]", benchmark));
zfooTest();
+ furyTest();
protobufTest();
kryoTest();
@@ -84,6 +90,7 @@ public void multipleThreadBenchmarks() throws InterruptedException {
System.out.println(StringUtils.format("[多线程性能测试-->[benchmark:{}]]", benchmark));
zfooMultipleThreadTest();
+ furyMultipleThreadTest();
protobufMultipleThreadTest();
kryoMultipleThreadTest();
@@ -135,6 +142,42 @@ public void zfooTest() {
System.out.println(StringUtils.format("[zfoo] [复杂对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.writerIndex(), System.currentTimeMillis() - startTime));
}
+ @Test
+ public void furyTest() {
+ var buffer = MemoryBuffer.newHeapBuffer(1_0000);
+ // 序列化和反序列化简单对象
+ long startTime = System.currentTimeMillis();
+ for (int i = 0; i < benchmark; i++) {
+ buffer.writerIndex(0);
+ buffer.readerIndex(0);
+ fury.serialize(buffer, simpleObject);
+ var obj = fury.deserialize(buffer);
+ }
+
+ System.out.println(StringUtils.format("[fury] [简单对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.writerIndex(), System.currentTimeMillis() - startTime));
+
+ // 序列化和反序列化常规对象
+ startTime = System.currentTimeMillis();
+ for (int i = 0; i < benchmark; i++) {
+ buffer.writerIndex(0);
+ buffer.readerIndex(0);
+ fury.serialize(buffer, normalObject);
+ var obj = fury.deserialize(buffer);
+ }
+
+ System.out.println(StringUtils.format("[fury] [常规对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.writerIndex(), System.currentTimeMillis() - startTime));
+
+ // 序列化和反序列化复杂对象
+ startTime = System.currentTimeMillis();
+ for (int i = 0; i < benchmark; i++) {
+ buffer.writerIndex(0);
+ buffer.readerIndex(0);
+ fury.serialize(buffer, complexObject);
+ var obj = fury.deserialize(buffer);
+ }
+ System.out.println(StringUtils.format("[fury] [复杂对象] [thread:{}] [size:{}] [time:{}]", Thread.currentThread().getName(), buffer.writerIndex(), System.currentTimeMillis() - startTime));
+ }
+
@Test
public void kryoTest() {
try {
@@ -235,6 +278,17 @@ public void zfooMultipleThreadTest() throws InterruptedException {
countdown.await();
}
+ @Test
+ public void furyMultipleThreadTest() throws InterruptedException {
+ var countdown = new CountDownLatch(threadNum);
+ for (var i = 0; i < threadNum; i++) {
+ executors[i].execute(() -> {
+ furyTest();
+ countdown.countDown();
+ });
+ }
+ countdown.await();
+ }
@Test
public void kryoMultipleThreadTest() throws InterruptedException {
@@ -310,6 +364,21 @@ protected Kryo initialValue() {
}
}
+ private static ThreadSafeFury fury;
+
+ static {
+ fury = new ThreadLocalFury(classLoader -> {
+ Fury f = Fury.builder().withLanguage(Language.JAVA)
+ .build();
+ f.register(ComplexObject.class);
+ f.register(NormalObject.class);
+ f.register(SimpleObject.class);
+ f.register(VeryBigObject.class);
+ f.register(ObjectA.class);
+ f.register(ObjectB.class);
+ return f;
+ });
+ }
// -------------------------------------------以下为测试用例---------------------------------------------------------------
// 简单类型