From 08ddb35bc31966d7c15d5e2689e146ec205d4f90 Mon Sep 17 00:00:00 2001 From: "jif2.zhang" Date: Mon, 11 Aug 2025 11:26:01 +0800 Subject: [PATCH] =?UTF-8?q?1.25=E7=A8=B3=E5=AE=9A=E6=80=A7bug=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=90=8C=E6=AD=A5=E5=88=B01.26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sge/database/SydApiBaseFunction.java | 33 +- .../sunyard/sge/database/SydApiBuilder.java | 2 +- .../sge/database/SydApiLongLinkWrap.java | 44 +- .../sge/plus/ConnectHandlerManager.java | 4 +- .../java/com/sunyard/sge/plus/SydLibrary.java | 2 +- src/test/java/test/FuncTest.java | 3 + src/test/java/test/TestAll.java | 1027 +++++++++++++++-- src/test/java/test/TestOpenClose.java | 210 ++++ 8 files changed, 1225 insertions(+), 100 deletions(-) create mode 100644 src/test/java/test/TestOpenClose.java diff --git a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java index e0120b0..eac85db 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBaseFunction.java @@ -1,5 +1,6 @@ package com.sunyard.sge.database; +import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.PointerByReference; import com.sunyard.SydApiException; @@ -29,7 +30,9 @@ public class SydApiBaseFunction implements SydApi { private boolean isShortLinkMode = false; // c 加速句柄,短链接。 - private PointerByReference phHandle = null; + private Pointer[] phHandle = new Pointer[1]; + + private Pointer pointer = null; private ILogFactory iLogFactory = new LogbackFactory(); private ILogger log = iLogFactory.getLogger(SydApiBaseFunction.class); @@ -64,7 +67,7 @@ public class SydApiBaseFunction implements SydApi { @Override public SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int allDealTimeOut) { - +// long s = System.currentTimeMillis(); if (log.isDebugEnabled()) { log.debug("SYD_Connect_Ex方法接收参数:pcIpList:{},iPortList:{},iConnectTimeOut:{},iDealTimeOut:{}", Arrays.toString(pcIpList), Arrays.toString(iPortList), iConnectTimeOut, allDealTimeOut); } @@ -72,8 +75,9 @@ public class SydApiBaseFunction implements SydApi { if (pcIpList.length != iPortList.length) { throw new IllegalArgumentException("ip与端口数量不一致"); } - SydApi4j[] apis = new SydApi4j[pcIpList.length]; int iDealTimeOut = allDealTimeOut / pcIpList.length; + SydApi4j[] apis = new SydApi4j[pcIpList.length]; + boolean connected = false; for (int i = 0; i < pcIpList.length; i++) { @@ -97,7 +101,7 @@ public class SydApiBaseFunction implements SydApi { // c 加速链接 if ( Env.isLinux() ) { - PointerByReference phHandle = new PointerByReference(); + Pointer[] phHandle = new Pointer[1]; int connectResult = SydLibrary.INSTANCE.SYD_Connect_Ex( pcIpList, iPortList, @@ -108,17 +112,21 @@ public class SydApiBaseFunction implements SydApi { phHandle); if ( 0 != connectResult ){ + // 释放已建立的链接 + this.SYD_Disconnect(); throw new SydApiException("连接错误", -1); } this.phHandle = phHandle; + this.pointer = phHandle[0]; } return this; } public void SYD_Disconnect() { if ( null != phHandle && Env.isLinux()) { - SydLibrary.INSTANCE.SYD_DisConnect_Ex(phHandle.getValue()); - phHandle = null; + SydLibrary.INSTANCE.SYD_DisConnect_Ex(this.pointer); + this.phHandle = null; + this.pointer = null; } if (null == hsms) { @@ -941,7 +949,7 @@ public class SydApiBaseFunction implements SydApi { IntByReference encDataLen = new IntByReference(encData.length); int i = SydLibrary.INSTANCE.SYD_SM4_Encrypt_Mac_ShortData( - phHandle.getValue(), + this.pointer, iEncKeyIndex, iMacKeyIndex, pcData, @@ -987,7 +995,7 @@ public class SydApiBaseFunction implements SydApi { log.debug("SYD_SM4_EncryptAndMac_ShortData:k1={} k2={}", iEncKeyIndex, iMacKeyIndex); } - if ( null != phHandle ) { + if ( null != pointer ) { return SYD_SM4_EncryptAndMac_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData); @@ -1009,7 +1017,7 @@ public class SydApiBaseFunction implements SydApi { int i = SydLibrary.INSTANCE.SYD_SM4_Decrypt_Mac_ShortData( - phHandle.getValue(), + pointer, iEncKeyIndex, iMacKeyIndex, pcData, @@ -1048,7 +1056,7 @@ public class SydApiBaseFunction implements SydApi { log.debug("SYD_SM4_CheckMacAndDecrypt_ShortData:k1={} k2={}", iEncKeyIndex, iMacKeyIndex); } - if( null != phHandle ) { + if( null != pointer ) { return SYD_SM4_CheckMacAndDecrypt_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData, mac); } else { boolean ret = SYD_SM4Mac_ShortData(iMacKeyIndex, pcData, 1040, mac); @@ -1217,4 +1225,9 @@ public class SydApiBaseFunction implements SydApi { } return ia; } + + @Override + protected void finalize() throws Throwable { + this.SYD_Disconnect_Ex(); + } } diff --git a/src/main/java/com/sunyard/sge/database/SydApiBuilder.java b/src/main/java/com/sunyard/sge/database/SydApiBuilder.java index 1cbe475..8fc842f 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiBuilder.java +++ b/src/main/java/com/sunyard/sge/database/SydApiBuilder.java @@ -51,7 +51,7 @@ public class SydApiBuilder { HsmLinkInfo[] linkInfo = HsmLinkInfo.mutiHsmLinkInfo(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut); this.pool = new SydApiPool(config, linkInfo); longLinkWorks = new CommWorker(); - warmUp( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut ); +// warmUp( pcIpList, iPortList, iConnectTimeOut, iDealTimeOut ); } public CommWorker getLongLinkWorks() { diff --git a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java index 1841ab1..d5c3169 100644 --- a/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java +++ b/src/main/java/com/sunyard/sge/database/SydApiLongLinkWrap.java @@ -166,11 +166,12 @@ public class SydApiLongLinkWrap implements SydApi { @Override public DataAndMac SYD_SM4_EncryptAndMac_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { - if (Env.isLinux()) { - return SYD_SM4_EncryptAndMac_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData); - } else { - return SYD_SM4_EncryptAndMac_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData); - } +// if (Env.isLinux()) { +// return SYD_SM4_EncryptAndMac_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData); +// } else { +// return SYD_SM4_EncryptAndMac_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData); +// } + return SYD_SM4_EncryptAndMac_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData); } DataAndMac SYD_SM4_EncryptAndMac_ShortData_c(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData) { @@ -221,11 +222,12 @@ public class SydApiLongLinkWrap implements SydApi { @Override public DataAndMacCheck SYD_SM4_CheckMacAndDecrypt_ShortData(int iEncKeyIndex, int iMacKeyIndex, byte[] pcData, byte[] macs) { - if (Env.isLinux()) { - return SYD_SM4_CheckMacAndDecrypt_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData, macs); - } else { - return SYD_SM4_CheckMacAndDecrypt_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData, macs); - } +// if (Env.isLinux()) { +// return SYD_SM4_CheckMacAndDecrypt_ShortData_c(iEncKeyIndex, iMacKeyIndex, pcData, macs); +// } else { +// return SYD_SM4_CheckMacAndDecrypt_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData, macs); +// } + return SYD_SM4_CheckMacAndDecrypt_ShortData_java(iEncKeyIndex, iMacKeyIndex, pcData, macs); } @@ -290,11 +292,12 @@ public class SydApiLongLinkWrap implements SydApi { @Override public List SYD_SM4_EncryptAndMac_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { - if (Env.isLinux()) { - return SYD_SM4_EncryptAndMac_BatchData_c(iEncKeyIndex, iMacKeyIndex, pcData); - } else { - return SYD_SM4_EncryptAndMac_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); - } +// if (Env.isLinux()) { +// return SYD_SM4_EncryptAndMac_BatchData_c(iEncKeyIndex, iMacKeyIndex, pcData); +// } else { +// return SYD_SM4_EncryptAndMac_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); +// } + return SYD_SM4_EncryptAndMac_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); } @@ -405,11 +408,12 @@ public class SydApiLongLinkWrap implements SydApi { @Override public List SYD_SM4_CheckMacAndDecrypt_BatchData(int[] iEncKeyIndex, int[] iMacKeyIndex, List pcData) { - if (Env.isLinux()) { - return SYD_SM4_CheckMacAndDecrypt_BatchData_c(iEncKeyIndex, iMacKeyIndex, pcData); - } else { - return SYD_SM4_CheckMacAndDecrypt_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); - } +// if (Env.isLinux()) { +// return SYD_SM4_CheckMacAndDecrypt_BatchData_c(iEncKeyIndex, iMacKeyIndex, pcData); +// } else { +// return SYD_SM4_CheckMacAndDecrypt_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); +// } + return SYD_SM4_CheckMacAndDecrypt_BatchData_java(iEncKeyIndex, iMacKeyIndex, pcData); } diff --git a/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java b/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java index c495b11..b8b19c5 100644 --- a/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java +++ b/src/main/java/com/sunyard/sge/plus/ConnectHandlerManager.java @@ -8,7 +8,7 @@ import com.sun.jna.ptr.PointerByReference; */ public class ConnectHandlerManager { - private static PointerByReference phHandle = new PointerByReference(); + private static Pointer[] phHandle = new Pointer[1]; private static Boolean inited = false; /** @@ -45,6 +45,6 @@ public class ConnectHandlerManager { } public static Pointer getHandler(){ - return phHandle.getValue(); + return phHandle[0]; } } diff --git a/src/main/java/com/sunyard/sge/plus/SydLibrary.java b/src/main/java/com/sunyard/sge/plus/SydLibrary.java index 1e2bfee..13d1957 100644 --- a/src/main/java/com/sunyard/sge/plus/SydLibrary.java +++ b/src/main/java/com/sunyard/sge/plus/SydLibrary.java @@ -21,7 +21,7 @@ public interface SydLibrary extends Library { int iConnectTimeOut, int iDealTimeOut, int iThreadCount, - PointerByReference phHandle); + Pointer[] phHandle); // 1.3 断开与设备的连接 int SYD_DisConnect_Ex(Pointer phHandle); diff --git a/src/test/java/test/FuncTest.java b/src/test/java/test/FuncTest.java index 16f0d4b..9d6c0f7 100644 --- a/src/test/java/test/FuncTest.java +++ b/src/test/java/test/FuncTest.java @@ -36,10 +36,12 @@ public class FuncTest { public SydApi connect() { if (isShortLink) { + System.out.println("short"); SydApi api = new SydApi4Database(); api.SYD_Short_Connect_Ex(config.getIps(), config.getPorts(), connectTimeout, dealTimeout); return api; } else { + System.out.println("long"); SydApiBuilder builder = new SydApiBuilder( config.getIps(), config.getPorts(), @@ -2185,6 +2187,7 @@ public class FuncTest { } } catch (SydApiException e){ printException("输入正确入参,校验失败", e); + e.printStackTrace(); } printEnd(); diff --git a/src/test/java/test/TestAll.java b/src/test/java/test/TestAll.java index f6d41f6..44212db 100644 --- a/src/test/java/test/TestAll.java +++ b/src/test/java/test/TestAll.java @@ -1,20 +1,14 @@ package test; -import com.sunyard.SydApiException; -import com.sunyard.proto.Util; import com.sunyard.sge.database.*; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; public class TestAll { private static final String[] ipListElec = new String[]{"127.0.0.1", "172.1.41.129"}; @@ -94,6 +88,17 @@ public class TestAll { } } + private void writeToPerformanceFile(String msg) { + try (FileWriter fw = new FileWriter(PERF_RESULT_FILE, true); + BufferedWriter bw = new BufferedWriter(fw)) { + String line = msg; + bw.write(line); + bw.newLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static void menu1(Config config, Choise choise, TestAll test) throws Exception { @@ -106,6 +111,9 @@ public class TestAll { System.out.println("2. 功能全量测试"); System.out.println("3. 性能单项测试"); System.out.println("4. 性能全量测试"); + System.out.println("5. 稳定性测试-长链接"); + System.out.println("6. 稳定性测试-短链接"); + System.out.println("7. 稳定性测试-长短链接交替测试"); System.out.println("-1. 退出"); @@ -127,12 +135,31 @@ public class TestAll { test.perfAll(); stopPerformanceFile(); break; + case 5: + SydApi.SYD_SetLogConfig("./logs", 0); + longLinkTestWD(test); + break; + case 6: + SydApi.SYD_SetLogConfig("./logs", 0); + shortLinkTestWD(test); + break; + case 7: + SydApi.SYD_SetLogConfig("./logs", 0); + shortAndLongLinkTestWD(test); + break; default: System.exit(0); } } } + SydApiBuilder builder = new SydApiBuilder( + config.getIps(), + config.getPorts(), + 1000, + 2000 + ); + public void sm4ShortEndes() throws InterruptedException { System.out.println("-------- SM4短数据加解密性能测试开始 --------"); @@ -143,15 +170,28 @@ public class TestAll { private static final String PERF_RESULT_FILE = "performance_results.txt"; + // 自定义 ThreadFactory + private static final ThreadFactory threadFactory = new ThreadFactory() { + private int counter = 0; // 线程计数器 + + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r); + thread.setName("MyThread-" + counter++); // 自定义线程名 + thread.setDaemon(false); // 非守护线程 + return thread; + } + }; + public void sm4ShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { byte[] data = new byte[plainLen]; - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); ThreadLocal Api = new ThreadLocal() { @Override @@ -229,12 +269,12 @@ public class TestAll { data.add(new byte[1024]); data.add(new byte[1024]); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); ThreadLocal Api = new ThreadLocal() { @Override @@ -304,12 +344,12 @@ public class TestAll { public void sm4macShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { byte[] data = new byte[plainLen]; - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); ThreadLocal Api = new ThreadLocal() { @Override @@ -351,12 +391,12 @@ public class TestAll { public void sm4macBatchEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { int[] keyIdx = new int[]{0, 0, 0, 0}; - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); ThreadLocal Api = new ThreadLocal() { @Override @@ -403,12 +443,12 @@ public class TestAll { public void sm3ShortEnde(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { byte[] data = new byte[plainLen]; - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); ThreadLocal Api = new ThreadLocal() { @Override @@ -473,9 +513,7 @@ public class TestAll { ThreadLocal Api = new ThreadLocal() { @Override protected SydApi initialValue() { - SydApi api = new SydApi4Database(); - api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); - return api; + return builder.build(); } }; @@ -549,12 +587,12 @@ public class TestAll { data.add(new byte[plainLen]); data.add(new byte[plainLen]); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); ThreadLocal Api = new ThreadLocal() { @@ -622,12 +660,12 @@ public class TestAll { int key = 0; // ByteBuffer enDataBuff = ByteBuffer.allocate(100 * 1024 * 1024 + 16); - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); long start = System.currentTimeMillis(); SydApi api = builder.build(); @@ -671,12 +709,12 @@ public class TestAll { byte[] data = new byte[2048]; - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); long start = System.currentTimeMillis(); SydApi api = builder.build(); @@ -703,12 +741,12 @@ public class TestAll { byte[] data = new byte[2048]; - SydApiBuilder builder = new SydApiBuilder( - config.getIps(), - config.getPorts(), - 1000, - 2000 - ); +// SydApiBuilder builder = new SydApiBuilder( +// config.getIps(), +// config.getPorts(), +// 1000, +// 2000 +// ); long start = System.currentTimeMillis(); SydApi api = builder.build(); @@ -745,6 +783,20 @@ public class TestAll { this.sm3LongEnde(); } + public void shortLinkPerfAll() throws InterruptedException { + this.sm4ShortEndes1(); + this.sm4BatchEndes1(); + this.sm4macShortEndes1(); + this.sm4macBatchEndes1(); + this.sm3ShortEndes1(); + this.sm4ShortMacEndes1(); + this.sm4BatchMacEndes1(); + + this.sm4LongEnde1(); + this.sm4MacLongEnde1(); + this.sm3LongEnde1(); + } + public static void showmenu() { System.out.println("请选择测试项:"); @@ -815,6 +867,840 @@ public class TestAll { } } + public static void perfMenu_wending(Config config, Choise choise, TestAll testAll){ + System.out.println("请输入想要运行的时间(小时)"); + int time = choise.getAsInt(); + System.out.println("请输入想要运行的线程数量"); + int numThread = choise.getAsInt(); + + System.out.println("-------- 稳定性测试开始 --------"); + + boolean isSuc = true; + for(int i=0; i<100000; i++){ + System.out.println("-------- 循环: --------" + i); + try { + FuncTest funcTest = new FuncTest(config); + funcTest.zc_funcAll(); + } catch (Exception e){ + //防止程序异常后运行结束 + e.printStackTrace(); + testAll.writeToPerformanceFile("Exception: " + e.getMessage()); + } + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + testAll.writeToPerformanceFile("Exception: " + e.getMessage()); + } + } + if(isSuc){ + System.out.println("-------- 稳定性测试结束 --------"); + return; + } + + + testAll.writeToPerformanceFile("time:" + time ); + + int num = 1; + long start = System.currentTimeMillis(); + while (true){ + testAll.writeToPerformanceFile("循环: " + (num++) + " " + testAll.getTime()); + + ExecutorService poolDec = Executors.newFixedThreadPool(numThread); + for (int i = 0; i < numThread; i++) { + poolDec.submit(() -> { + try { + FuncTest funcTest = new FuncTest(config); + funcTest.zc_funcAll(); + } catch (Exception e){ + //防止程序异常后运行结束 + testAll.writeToPerformanceFile("Exception: " + e.getMessage()); + } + }); + } + poolDec.shutdown(); + try { + poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + } catch (InterruptedException e) { + testAll.writeToPerformanceFile("Exception: " + e.getMessage()); + } + + long end = System.currentTimeMillis(); + if( (end-start) > (time*60*60*1000) ){ + break; + } + } + + System.out.println("-------- 稳定性测试结束 --------"); + } + + public void sm4ShortEndes1() throws InterruptedException { + System.out.println("-------- SM4短数据加解密性能测试开始 --------"); + sm4ShortEnde1(1, config.getTotal(), 1024); + sm4ShortEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM4短数据加解密性能测试结束 --------\n"); + } + + + public void sm4ShortEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + byte[] data = new byte[plainLen]; + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_ShortData(0, data, ECB_ENC); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatencyEnc = numberOfThreads * duration * 1.0 / totalRequest; + System.out.println("平均延时(加密): " + String.format("%.2f", avgLatencyEnc) + " ms"); + + writeToPerformanceFile("SM4短数据加密", 1024, 1, numberOfThreads, totalRequest, tps, avgLatencyEnc); + + SydApi apiTest = Api.get(); + byte[] res = apiTest.SYD_SM4_ShortData(0, data, ECB_ENC); + apiTest.SYD_Disconnect_Ex(); + + ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); + start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolDec.submit(() -> { + SydApi api = Api.get(); + byte[] plain = api.SYD_SM4_ShortData(0, res, ECB_DEC); + }); + } + poolDec.shutdown(); + poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + + end = System.currentTimeMillis(); + duration = end - start; + tps = totalRequest * 1000.0 / duration; + throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatencyDec = numberOfThreads * duration * 1.0 / totalRequest; + System.out.println("平均延时(解密): " + String.format("%.2f", avgLatencyDec) + " ms"); + + writeToPerformanceFile("SM4短数据解密", 1024, 1, numberOfThreads, totalRequest, tps, avgLatencyDec); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + public void sm4BatchEndes1() throws InterruptedException { + System.out.println("-------- SM4批量数据加解密性能测试开始 --------"); + sm4BatchEnde1(1, config.getTotal(), 1024); + sm4BatchEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM4批量数据加解密性能测试结束 --------\n"); + } + + public void sm4BatchEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + int[] keyIdx = new int[]{0, 0, 0, 0}; + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_BatchData(keyIdx, data, ECB_ENC); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4批量数据加密", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); + + SydApi apiTest = Api.get(); + List res = apiTest.SYD_SM4_BatchData(keyIdx, data, ECB_ENC); + apiTest.SYD_Disconnect_Ex(); + + ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); + start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolDec.submit(() -> { + SydApi api = Api.get(); + List plain = api.SYD_SM4_BatchData(keyIdx, res, ECB_DEC); + }); + } + poolDec.shutdown(); + poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + end = System.currentTimeMillis(); + duration = end - start; + tps = totalRequest * 1000.0 / duration; + throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4批量数据解密", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + public void sm4macShortEndes1() throws InterruptedException { + System.out.println("-------- SM4MAC短数据性能测试开始 --------"); + sm4macShortEnde1(1, config.getTotal(), 1024); + sm4macShortEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM4MAC短数据性能测试结束 --------\n"); + } + + + public void sm4macShortEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + byte[] data = new byte[plainLen]; + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4Mac_ShortData(0, data); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4MAC 短数据", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + + public void sm4macBatchEndes1() throws InterruptedException { + System.out.println("-------- SM4MAC批量数据性能测试开始 --------"); + sm4macBatchEnde1(1, config.getTotal(), 1024); + sm4macBatchEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM4MAC 批量数据性能测试结束 --------\n"); + } + + public void sm4macBatchEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + int[] keyIdx = new int[]{0, 0, 0, 0}; + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + List data = new ArrayList<>(); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + data.add(new byte[1024]); + + try { + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + List s = api.SYD_SM4Mac_BatchData(keyIdx, data); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4MAC 批量数据", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + public void sm3ShortEndes1() throws InterruptedException { + System.out.println("-------- SM3短数据性能测试开始 --------"); + sm3ShortEnde1(1, config.getTotal(), 1024); + sm3ShortEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM3短数据性能测试结束 --------\n"); + } + + public void sm3ShortEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + byte[] data = new byte[plainLen]; + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM3_Hash_ShortData(data); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM3 短数据", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + public void sm4ShortMacEndes1() throws InterruptedException { + System.out.println("-------- SM4短数据加密生成MAC,验证MAC解密性能测试开始 --------"); + System.out.println("单线程"); + sm4ShortMacEnde1(1, config.getTotal(), 1024); + + System.out.println("40 线程"); + sm4ShortMacEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM4短数据加密生成MAC,验证MAC解密性能测试结束 --------\n"); + } + + public void sm4ShortMacEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + byte[] data = new byte[plainLen]; + int keyEnc = 0; + int keyMac = 0; + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + SydApi apiTest = Api.get(); + DataAndMac ret = apiTest.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data); + apiTest.SYD_Disconnect_Ex(); + + + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4短数据加密并生成MAC", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); + + + ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); + start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolDec.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, ret.getData(), ret.getMac()); + }); + } + poolDec.shutdown(); + poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + end = System.currentTimeMillis(); + duration = end - start; + tps = totalRequest * 1000.0 / duration; + throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4短数据解密并校验MAC", 1024, 1, numberOfThreads, totalRequest, tps, avgLatency); + + + } + + public void sm4BatchMacEndes1() throws InterruptedException { + System.out.println("-------- SM4批量数据加密生成MAC,验证MAC解密性能测试开始 --------"); + System.out.println("单线程"); + sm4BatchMacEnde1(1, config.getTotal(), 1024); + System.out.println("40 线程"); + sm4BatchMacEnde1(40, config.getTotal(), 1024); + System.out.println("-------- SM4批量数据加密生成MAC,验证MAC解密性能测试结束 --------\n"); + } + + public void sm4BatchMacEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + int[] keyEnc = new int[]{0, 0, 0, 0}; + int[] keyMac = new int[]{0, 0, 0, 0}; + List data = new ArrayList<>(); + data.add(new byte[plainLen]); + data.add(new byte[plainLen]); + data.add(new byte[plainLen]); + data.add(new byte[plainLen]); + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + SydApi apiTest = Api.get(); + List ret = apiTest.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); + apiTest.SYD_Disconnect_Ex(); + + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_EncryptAndMac_BatchData(keyEnc, keyMac, data); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4批量数据加密并生成MAC", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); + + ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); + start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolDec.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_CheckMacAndDecrypt_BatchData(keyEnc, keyMac, ret); + }); + } + poolDec.shutdown(); + poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + end = System.currentTimeMillis(); + duration = end - start; + tps = totalRequest * 1000.0 / duration; + throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + writeToPerformanceFile("SM4批量数据解密并校验MAC", 1024, 1, numberOfThreads, totalRequest, String.format("%.2f", tps) + " x 4", avgLatency); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + public void sm4LongEnde1() { + System.out.println("-------- SM4长数据加解密性能测试开始 --------"); + + byte[] data = new byte[2048]; + int key = 0; +// ByteBuffer enDataBuff = ByteBuffer.allocate(100 * 1024 * 1024 + 16); + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + long start = System.currentTimeMillis(); + SydApi api = Api.get(); + + ISM4 sm4 = api.initSM4(key, ECB_ENC); + for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) { + sm4.update(data); + } + byte[] res = sm4.finish(); + + + long end = System.currentTimeMillis(); + long duration = end - start; + double throughput = 100.0 * 1000 / duration; + + System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + writeToPerformanceFile2("SM4长数据加密", "100M", 1, 1, throughput); + + start = System.currentTimeMillis(); + + sm4 = api.initSM4(key, ECB_DEC); + for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) { + sm4.update(data); + } + // sm4.finish(); + + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + end = System.currentTimeMillis(); + duration = end - start; + throughput = 100.0 * 1000 / duration; + + System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + writeToPerformanceFile2("SM4长数据解密", "100M", 1, 1, throughput); + + System.out.println("-------- SM4长数据加解密性能测试结束 --------\\n"); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + + } + + public void sm4MacLongEnde1() { + System.out.println("-------- SM4MAC长数据性能测试开始 --------"); + + byte[] data = new byte[2048]; + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + long start = System.currentTimeMillis(); + SydApi api = Api.get(); + + ISM4Mac sm4mac = api.initSM4Mac(0); + for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) { + sm4mac.update(data); + } + sm4mac.digest(); + + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double throughput = 100.0 * 1000 / duration; + + System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + writeToPerformanceFile2("SM4长数据MAC", "100M", 1, 1, throughput); + + System.out.println("-------- SM4MAC长数据性能测试结束 --------"); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + public void sm3LongEnde1() { + System.out.println("-------- SM3长数据性能测试开始 --------"); + + byte[] data = new byte[2048]; + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(),config.getPorts(),1000,2000); + syncSet.add( api ); + return api; + } + }; + + try { + long start = System.currentTimeMillis(); + SydApi api = Api.get(); + + ISM3 sm3 = api.initSM3(); + for (int i = 0; i < 100 * 1024 * 1024 / data.length; i++) { + sm3.update(data); + } + sm3.digest(); + + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + + long end = System.currentTimeMillis(); + long duration = end - start; + double throughput = 100.0 * 1000 / duration; + + System.out.println("共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + writeToPerformanceFile2("SM3长数据", "100MB", 1, 1, throughput); + + System.out.println("-------- SM3长数据性能测试结束 --------"); + } finally { +// Api.get().SYD_Disconnect_Ex(); +// Api.remove(); + } + } + + + private static final AtomicInteger successCount = new AtomicInteger(0); + private static final AtomicInteger errorCount = new AtomicInteger(0); + private static final int MAX_ERRORS = 100; + private static final long TEST_DURATION_HOURS = 72; + + public static void longLinkTestWD(TestAll test){ + System.out.println("=== 开始长链接稳定性测试 ==="); + System.out.printf("配置: %d小时 | 最大错误数%d\n", + TEST_DURATION_HOURS, MAX_ERRORS); + + long endTime = System.currentTimeMillis() + + TimeUnit.HOURS.toMillis(TEST_DURATION_HOURS); + + while (System.currentTimeMillis() < endTime && + errorCount.get() < MAX_ERRORS) { + try { + // 调用测试接口 + test.perfAll(); + successCount.incrementAndGet(); + + } catch (Exception e) { + errorCount.incrementAndGet(); + System.err.println("测试失败: " + e.getMessage()); + } + } + + System.out.println("\n=== 测试结果 ==="); + System.out.println("成功次数: " + successCount.get()); + System.out.println("失败次数: " + errorCount.get()); + System.out.println("测试时长: " + TEST_DURATION_HOURS + "小时"); + } + + public static void shortLinkTestWD(TestAll test){ + System.out.println("=== 开始短链接稳定性测试 ==="); + System.out.printf("配置: %d小时 | 最大错误数%d\n", + TEST_DURATION_HOURS, MAX_ERRORS); + + long endTime = System.currentTimeMillis() + + TimeUnit.HOURS.toMillis(TEST_DURATION_HOURS); + + while (System.currentTimeMillis() < endTime && + errorCount.get() < MAX_ERRORS) { + try { + // 调用测试接口 + test.shortLinkPerfAll(); + successCount.incrementAndGet(); + + } catch (Exception e) { + errorCount.incrementAndGet(); + System.err.println("测试失败: " + e.getMessage()); + } + } + + System.out.println("\n=== 测试结果 ==="); + System.out.println("成功次数: " + successCount.get()); + System.out.println("失败次数: " + errorCount.get()); + System.out.println("测试时长: " + TEST_DURATION_HOURS + "小时"); + } + + public static void shortAndLongLinkTestWD(TestAll test){ + System.out.println("=== 开始长-短链接交替稳定性测试 ==="); + System.out.printf("配置: %d小时 | 最大错误数%d\n", + TEST_DURATION_HOURS, MAX_ERRORS); + + long endTime = System.currentTimeMillis() + + TimeUnit.HOURS.toMillis(TEST_DURATION_HOURS); + + boolean isShort = false; + while (System.currentTimeMillis() < endTime && + errorCount.get() < MAX_ERRORS) { + try { + System.out.println("-------------------切换为长链接--------------------"); + isShort = false; + System.out.println("isShort=" + isShort); + // 调用测试接口 + test.perfAll(); + + + System.out.println("-------------------切换为短链接--------------------"); + isShort = true; + System.out.println("isShort=" + isShort); + + test.shortLinkPerfAll(); + successCount.incrementAndGet(); + + } catch (Exception e) { + errorCount.incrementAndGet(); + System.out.println("isShort=" + isShort); + System.err.println("测试失败: " + e.getMessage()); + } + } + + System.out.println("\n=== 测试结果 ==="); + System.out.println("成功次数: " + successCount.get()); + System.out.println("失败次数: " + errorCount.get()); + System.out.println("测试时长: " + TEST_DURATION_HOURS + "小时"); + } private static Config config = null; @@ -837,4 +1723,13 @@ public class TestAll { } + private String getTime(){ + Date now = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String timeStr = sdf.format(now); + + return timeStr; + } + + } diff --git a/src/test/java/test/TestOpenClose.java b/src/test/java/test/TestOpenClose.java new file mode 100644 index 0000000..b02bffb --- /dev/null +++ b/src/test/java/test/TestOpenClose.java @@ -0,0 +1,210 @@ +package test; + +import com.sun.jna.Pointer; +import com.sunyard.sge.database.DataAndMac; +import com.sunyard.sge.database.SydApi; +import com.sunyard.sge.database.SydApi4Database; +import com.sunyard.sge.plus.SydLibrary; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class TestOpenClose { + + private static Config config ; + + + public static void sm4ShortMacEnde1(int numberOfThreads, int totalRequest, int plainLen) throws InterruptedException { + byte[] data = new byte[plainLen]; + int keyEnc = 0; + int keyMac = 0; + + Set syncSet = Collections.synchronizedSet(new HashSet<>()); + + ThreadLocal Api = new ThreadLocal() { + @Override + protected SydApi initialValue() { + SydApi api = new SydApi4Database(); + try { + api.SYD_Short_Connect_Ex(config.getIps(), config.getPorts(), 2000, 2000); + System.out.println("create link " + Thread.currentThread().getName()); + syncSet.add( api ); + System.out.println("建立链接 " + syncSet.size()); + }catch (Exception e) { + System.out.println("error link " + Thread.currentThread().getName()); + // e.printStackTrace(); + throw e; + } + return api; + } + }; + + + try { + System.out.println("准备密文数据"); + SydApi apiTest = Api.get(); + final DataAndMac ret = apiTest.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data); + apiTest.SYD_Disconnect_Ex(); + System.out.println("密文数据准备完成"); + + ExecutorService poolEnc = Executors.newFixedThreadPool(numberOfThreads); + long start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolEnc.submit(() -> { + SydApi api = Api.get(); + if ( null == api ) { + System.out.println("api is null"); + } + api.SYD_SM4_EncryptAndMac_ShortData(keyEnc, keyMac, data); + + // System.out.println("encrypt " + Thread.currentThread().getName()); + + + // System.out.println("Thread=" + Thread.currentThread().getName()); + // SydApi4Database adb = (SydApi4Database) api; + // System.out.println("handler=" + adb.getHandler()); + }); + } + poolEnc.shutdown(); + poolEnc.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + System.out.println("释放链接 " + syncSet.size()); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + // System.out.println("sleep"); + // Thread.sleep(10 * 1000); + + + + long end = System.currentTimeMillis(); + long duration = end - start; + double tps = totalRequest * 1000.0 / duration; + double throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("加密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + double avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + + + + ExecutorService poolDec = Executors.newFixedThreadPool(numberOfThreads); + start = System.currentTimeMillis(); + for (int i = 0; i < totalRequest; i++) { + poolDec.submit(() -> { + SydApi api = Api.get(); + api.SYD_SM4_CheckMacAndDecrypt_ShortData(keyEnc, keyMac, ret.getData(), ret.getMac()); + // System.out.println("decrypt " + Thread.currentThread().getName()); + }); + } + poolDec.shutdown(); + poolDec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); + System.out.println("释放链接 " + syncSet.size()); + syncSet.forEach(SydApi::SYD_Disconnect_Ex); + syncSet.clear(); + // System.out.println("sleep"); + // Thread.sleep(10 * 1000); + + + end = System.currentTimeMillis(); + duration = end - start; + tps = totalRequest * 1000.0 / duration; + throughput = totalRequest * 1000.0 / duration * plainLen / 1024 / 1024; + + System.out.println("并发数: " + numberOfThreads); + System.out.println("解密共花费 " + String.format("%.2f", duration / 1000.0) + " 秒"); + System.out.println("TPS: " + String.format("%.2f", tps)); + System.out.println("吞吐量: " + String.format("%.2f", throughput) + " MB/S"); + avgLatency = numberOfThreads * duration * 1.0 / totalRequest; + } catch (Exception e) { + System.out.println("密文数据准备异常"); + e.printStackTrace(); + throw e; + } + } + + + public static void case1(){ + System.out.println("case1 start"); +// PointerByReference phHandle = new PointerByReference(); + + Pointer[] phHandle = new Pointer[1]; + int connectResult = SydLibrary.INSTANCE.SYD_Connect_Ex( + config.getIps(), + config.getPorts(), + config.getIps().length, + 1000, + 2000, + 0, + phHandle); + + if ( 0 != connectResult ){ + System.out.println("link error" + connectResult); + } else { + System.out.println("SYD_Disconnect this.phHandle=" + Pointer.nativeValue(phHandle[0])); + System.out.println("link"); + } + + System.out.println("SYD_Disconnect this.phHandle=" + Pointer.nativeValue(phHandle[0])); + int disResult = SydLibrary.INSTANCE.SYD_DisConnect_Ex(phHandle[0]); + if ( 0 != disResult ){ + System.out.println("disResult error" + disResult); + } else { + System.out.println("disResult"); + } + + System.out.println("case1 end"); + } + + public static void case2(){ + System.out.println("case2 start"); + SydApi4Database api = new SydApi4Database(); + api.SYD_Short_Connect_Ex(config.getIps(), config.getPorts(), 2000, 2000); + api.SYD_Disconnect_Ex(); + System.out.println("case2 end"); + } + + + public static void case3(String[] args) throws InterruptedException { + int threads = 40; + + try { + threads = Integer.valueOf(args[0]); + }catch ( Exception e ) { + + } + + System.out.println("threads=" + threads); + + + System.out.println("case3 start"); + while (true) { + sm4ShortMacEnde1(threads, 100000, 1024); + } + +// System.out.println("case3 end"); + } + + + public static void main(String[] args) throws InterruptedException { + + // 载入配置文件 + config = Config.loadConfig(); + System.out.println("config=" + Arrays.toString(config.getIps())); + + +// case1(); + + +// case2(); + + + case3(args); + + } +}