From 06cb5cdd3fbdfb0f729a14c061304820b410fdc2 Mon Sep 17 00:00:00 2001 From: hdyztmdqd Date: Mon, 27 Jun 2022 11:16:15 +0800 Subject: [PATCH] Optimization code (#10158) * Use StringBuilder#append(Char) to improve performance * replace with lambda * The original implementation calls the get method twice.Replace it with computeIfAbsent. Co-authored-by: huangdeyuan <295258290@qq.com> --- .../cluster/router/RouterSnapshotNode.java | 4 +- .../router/mesh/route/MeshRuleRouter.java | 2 +- .../router/state/RouterGroupingState.java | 2 +- .../java/org/apache/dubbo/common/URL.java | 6 +-- .../apache/dubbo/common/bytecode/Mixin.java | 2 +- .../apache/dubbo/common/bytecode/Proxy.java | 2 +- .../common/extension/ExtensionLoader.java | 37 +++++++++---------- .../dubbo/common/profiler/Profiler.java | 4 +- .../dubbo/common/utils/ExecutorUtil.java | 23 +++++------- .../common/io/UnsafeStringWriterTest.java | 2 +- .../support/AbstractMetadataReport.java | 27 ++++++-------- .../AbstractServiceAnnotationProcessor.java | 2 +- .../dubbo/qos/command/impl/ChangeTelnet.java | 2 +- .../qos/command/impl/GetRouterSnapshot.java | 2 +- .../dubbo/qos/command/impl/InvokeTelnet.java | 2 +- .../qos/server/handler/QosProcessHandler.java | 13 ++----- .../ServiceInstancesChangedListener.java | 2 +- .../registry/multicast/MulticastRegistry.java | 13 +++---- .../http/jetty/JettyLoggerAdapter.java | 2 +- .../dubbo/test/check/DubboTestChecker.java | 2 +- 20 files changed, 68 insertions(+), 83 deletions(-) diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/RouterSnapshotNode.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/RouterSnapshotNode.java index d8f21a9a3d..b0a09759b6 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/RouterSnapshotNode.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/RouterSnapshotNode.java @@ -116,10 +116,10 @@ public class RouterSnapshotNode { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("[ ") .append(name) - .append(" ") + .append(' ') .append("(Input: ").append(beforeSize).append(") ") .append("(Current Node Output: ").append(nodeOutputSize).append(") ") - .append("(Chain Node Output: ").append(chainOutputSize).append(")") + .append("(Chain Node Output: ").append(chainOutputSize).append(')') .append(routerMessage == null ? "" : " Router message: ") .append(routerMessage == null ? "" : routerMessage) .append(" ] "); diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java index de4ab18f3f..105332e9b7 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleRouter.java @@ -103,7 +103,7 @@ public abstract class MeshRuleRouter extends AbstractStateRouter implement BitList> destination = meshRuleCache.getSubsetInvokers(appName, subset); result = result.or(destination); if (stringBuilder != null) { - stringBuilder.append("Match App: ").append(appName).append(" Subset: ").append(subset).append(" "); + stringBuilder.append("Match App: ").append(appName).append(" Subset: ").append(subset).append(' '); } } } diff --git a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/RouterGroupingState.java b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/RouterGroupingState.java index 396efa1f1a..fed028b7e2 100644 --- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/RouterGroupingState.java +++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/state/RouterGroupingState.java @@ -49,7 +49,7 @@ public class RouterGroupingState { public String toString() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(routerName) - .append(" ") + .append(' ') .append(" Total: ") .append(total) .append("\n"); diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java index fb9f1b65a5..2e1eb3a17a 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java @@ -378,11 +378,11 @@ class URL implements Serializable { if (StringUtils.isNotEmpty(getHost())) { if (StringUtils.isNotEmpty(getUsername()) || StringUtils.isNotEmpty(getPassword())) { - ret.append("@"); + ret.append('@'); } ret.append(getHost()); if (getPort() != 0) { - ret.append(":"); + ret.append(':'); ret.append(getPort()); } } @@ -406,7 +406,7 @@ class URL implements Serializable { ret.append(getUsername()); } - ret.append(":"); + ret.append(':'); if (StringUtils.isNotEmpty(getPassword())) { ret.append(getPassword()); diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java index 88f23be03e..86b819d0b6 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java @@ -108,7 +108,7 @@ public abstract class Mixin { code.append('d').append(i).append(" = (").append(dcs[i].getName()).append(")$1[").append(i).append("];\n"); if (MixinAware.class.isAssignableFrom(dcs[i])) { - code.append("d").append(i).append(".setMixinInstance(this);\n"); + code.append('d').append(i).append(".setMixinInstance(this);\n"); } } ccp.addConstructor(Modifier.PUBLIC, new Class[]{Object[].class}, code.toString()); diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java index 30617a2226..c3f14bee12 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java @@ -150,7 +150,7 @@ public class Proxy { StringBuilder code = new StringBuilder("Object[] args = new Object[").append(pts.length).append("];"); for (int j = 0; j < pts.length; j++) { - code.append(" args[").append(j).append("] = ($w)$").append(j + 1).append(";"); + code.append(" args[").append(j).append("] = ($w)$").append(j + 1).append(';'); } code.append(" Object ret = handler.invoke(this, methods[").append(ix).append("], args);"); if (!Void.TYPE.equals(rt)) { diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java index a170f3684c..2c0d955b8c 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java @@ -1095,28 +1095,27 @@ public class ExtensionLoader { } } - if (urlListMap.get(resourceURL) != null) { - return urlListMap.get(resourceURL); - } + List contentList = urlListMap.computeIfAbsent(resourceURL,key->{ + List newContentList = new ArrayList<>(); - List newContentList = new ArrayList<>(); - - try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), StandardCharsets.UTF_8))) { - String line; - while ((line = reader.readLine()) != null) { - final int ci = line.indexOf('#'); - if (ci >= 0) { - line = line.substring(0, ci); - } - line = line.trim(); - if (line.length() > 0) { - newContentList.add(line); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(resourceURL.openStream(), StandardCharsets.UTF_8))) { + String line; + while ((line = reader.readLine()) != null) { + final int ci = line.indexOf('#'); + if (ci >= 0) { + line = line.substring(0, ci); + } + line = line.trim(); + if (line.length() > 0) { + newContentList.add(line); + } } + } catch (IOException e) { + throw new RuntimeException(e.getMessage(), e); } - } - - urlListMap.put(resourceURL, newContentList); - return newContentList; + return newContentList; + }); + return contentList; } private boolean isIncluded(String className, String... includedPackages) { diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/profiler/Profiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/profiler/Profiler.java index 8bb1920e19..4fc50d90d0 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/profiler/Profiler.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/profiler/Profiler.java @@ -79,9 +79,9 @@ public class Profiler { long offset = entry.getStartTime() - startTime; List lines = new LinkedList<>(); stringBuilder.append("+-[ Offset: ") - .append(offset / 1000_000).append(".").append(String.format("%06d", offset % 1000_000)) + .append(offset / 1000_000).append('.').append(String.format("%06d", offset % 1000_000)) .append("ms; Usage: ") - .append(usage / 1000_000).append(".").append(String.format("%06d", usage % 1000_000)) + .append(usage / 1000_000).append('.').append(String.format("%06d", usage % 1000_000)) .append("ms, ") .append(percent) .append("% ] ") diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ExecutorUtil.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ExecutorUtil.java index 97f13a5f96..c462ac4d7d 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ExecutorUtil.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/ExecutorUtil.java @@ -99,21 +99,18 @@ public class ExecutorUtil { private static void newThreadToCloseExecutor(final ExecutorService es) { if (!isTerminated(es)) { - SHUTDOWN_EXECUTOR.execute(new Runnable() { - @Override - public void run() { - try { - for (int i = 0; i < 1000; i++) { - es.shutdownNow(); - if (es.awaitTermination(10, TimeUnit.MILLISECONDS)) { - break; - } + SHUTDOWN_EXECUTOR.execute(() -> { + try { + for (int i = 0; i < 1000; i++) { + es.shutdownNow(); + if (es.awaitTermination(10, TimeUnit.MILLISECONDS)) { + break; } - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - } catch (Throwable e) { - logger.warn(e.getMessage(), e); } + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } catch (Throwable e) { + logger.warn(e.getMessage(), e); } }); } diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/io/UnsafeStringWriterTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/io/UnsafeStringWriterTest.java index dbe8d5ca16..3f4c0c81c2 100644 --- a/dubbo-common/src/test/java/org/apache/dubbo/common/io/UnsafeStringWriterTest.java +++ b/dubbo-common/src/test/java/org/apache/dubbo/common/io/UnsafeStringWriterTest.java @@ -45,7 +45,7 @@ public class UnsafeStringWriterTest { @Test public void testAppend() { UnsafeStringWriter writer = new UnsafeStringWriter(); - writer.append("a"); + writer.append('a'); writer.append("abc", 1, 2); writer.append('c'); writer.flush(); diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java index 1e2d26c61e..e24e273739 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java @@ -453,22 +453,19 @@ public abstract class AbstractMetadataReport implements MetadataReport { if (retryScheduledFuture == null) { synchronized (retryCounter) { if (retryScheduledFuture == null) { - retryScheduledFuture = retryExecutor.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - // Check and connect to the metadata - try { - int times = retryCounter.incrementAndGet(); - logger.info("start to retry task for metadata report. retry times:" + times); - if (retry() && times > retryTimesIfNonFail) { - cancelRetryTask(); - } - if (times > retryLimit) { - cancelRetryTask(); - } - } catch (Throwable t) { // Defensive fault tolerance - logger.error("Unexpected error occur at failed retry, cause: " + t.getMessage(), t); + retryScheduledFuture = retryExecutor.scheduleWithFixedDelay(() -> { + // Check and connect to the metadata + try { + int times = retryCounter.incrementAndGet(); + logger.info("start to retry task for metadata report. retry times:" + times); + if (retry() && times > retryTimesIfNonFail) { + cancelRetryTask(); } + if (times > retryLimit) { + cancelRetryTask(); + } + } catch (Throwable t) { // Defensive fault tolerance + logger.error("Unexpected error occur at failed retry, cause: " + t.getMessage(), t); } }, 500, retryPeriod, TimeUnit.MILLISECONDS); } diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/AbstractServiceAnnotationProcessor.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/AbstractServiceAnnotationProcessor.java index 0eacd6ade5..d65c6ba7e8 100644 --- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/AbstractServiceAnnotationProcessor.java +++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/AbstractServiceAnnotationProcessor.java @@ -82,7 +82,7 @@ public abstract class AbstractServiceAnnotationProcessor extends AbstractProcess }); methodSignatureBuilder.append(method.getReturnType()) - .append(" ") + .append(' ') .append(method.toString()); return methodSignatureBuilder.toString(); diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java index d0a9f2d999..96d6d3c5e2 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/ChangeTelnet.java @@ -51,7 +51,7 @@ public class ChangeTelnet implements BaseCommand { StringBuilder buf = new StringBuilder(); if ("/".equals(message) || "..".equals(message)) { String service = channel.attr(SERVICE_KEY).getAndRemove(); - buf.append("Cancelled default service ").append(service).append("."); + buf.append("Cancelled default service ").append(service).append('.'); } else { boolean found = false; for (Exporter exporter : dubboProtocol.getExporters()) { diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/GetRouterSnapshot.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/GetRouterSnapshot.java index b827da6748..0c34f18f9e 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/GetRouterSnapshot.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/GetRouterSnapshot.java @@ -57,7 +57,7 @@ public class GetRouterSnapshot implements BaseCommand { for (Map.Entry> invokerEntry : invokerMap.entrySet()) { Directory directory = invokerEntry.getValue().getDirectory(); StateRouter headStateRouter = directory.getRouterChain().getHeadStateRouter(); - stringBuilder.append(metadata.getServiceKey()).append("@").append(Integer.toHexString(System.identityHashCode(metadata))) + stringBuilder.append(metadata.getServiceKey()).append('@').append(Integer.toHexString(System.identityHashCode(metadata))) .append("\n") .append("[ All Invokers:").append(directory.getAllInvokers().size()).append(" ] ") .append("[ Valid Invokers: ").append(((AbstractDirectory)directory).getValidInvokers().size()).append(" ]\n") diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java index 6ac889ed80..507282160e 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/command/impl/InvokeTelnet.java @@ -133,7 +133,7 @@ public class InvokeTelnet implements BaseCommand { if (!StringUtils.isEmpty(service)) { - buf.append("Use default service ").append(service).append("."); + buf.append("Use default service ").append(service).append('.'); } if (selectedProvider == null) { buf.append("\r\nNo such service ").append(service); diff --git a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java index f1dc1eee77..4e5ef439f8 100644 --- a/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java +++ b/dubbo-plugin/dubbo-qos/src/main/java/org/apache/dubbo/qos/server/handler/QosProcessHandler.java @@ -57,16 +57,11 @@ public class QosProcessHandler extends ByteToMessageDecoder { @Override public void channelActive(final ChannelHandlerContext ctx) throws Exception { - welcomeFuture = ctx.executor().schedule(new Runnable() { - - @Override - public void run() { - if (welcome != null) { - ctx.write(Unpooled.wrappedBuffer(welcome.getBytes())); - ctx.writeAndFlush(Unpooled.wrappedBuffer(PROMPT.getBytes())); - } + welcomeFuture = ctx.executor().schedule(() -> { + if (welcome != null) { + ctx.write(Unpooled.wrappedBuffer(welcome.getBytes())); + ctx.writeAndFlush(Unpooled.wrappedBuffer(PROMPT.getBytes())); } - }, 500, TimeUnit.MILLISECONDS); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java index 3142f5f202..486fd90868 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java @@ -328,7 +328,7 @@ public class ServiceInstancesChangedListener { } builder.append(entry.getKey()); - builder.append(" "); + builder.append(' '); } if (emptyMetadataNum > 0) { diff --git a/dubbo-registry/dubbo-registry-multicast/src/main/java/org/apache/dubbo/registry/multicast/MulticastRegistry.java b/dubbo-registry/dubbo-registry-multicast/src/main/java/org/apache/dubbo/registry/multicast/MulticastRegistry.java index 689d3c81d8..f9679153e1 100644 --- a/dubbo-registry/dubbo-registry-multicast/src/main/java/org/apache/dubbo/registry/multicast/MulticastRegistry.java +++ b/dubbo-registry/dubbo-registry-multicast/src/main/java/org/apache/dubbo/registry/multicast/MulticastRegistry.java @@ -134,14 +134,11 @@ public class MulticastRegistry extends FailbackRegistry { } this.cleanPeriod = url.getParameter(SESSION_TIMEOUT_KEY, DEFAULT_SESSION_TIMEOUT); if (url.getParameter("clean", true)) { - this.cleanFuture = cleanExecutor.scheduleWithFixedDelay(new Runnable() { - @Override - public void run() { - try { - clean(); // Remove the expired - } catch (Throwable t) { // Defensive fault tolerance - logger.error("Unexpected exception occur at clean expired provider, cause: " + t.getMessage(), t); - } + this.cleanFuture = cleanExecutor.scheduleWithFixedDelay(() -> { + try { + clean(); // Remove the expired + } catch (Throwable t) { // Defensive fault tolerance + logger.error("Unexpected exception occur at clean expired provider, cause: " + t.getMessage(), t); } }, cleanPeriod, cleanPeriod, TimeUnit.MILLISECONDS); } else { diff --git a/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/jetty/JettyLoggerAdapter.java b/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/jetty/JettyLoggerAdapter.java index cb9a84f35e..1b7f1aa85f 100644 --- a/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/jetty/JettyLoggerAdapter.java +++ b/dubbo-remoting/dubbo-remoting-http/src/main/java/org/apache/dubbo/remoting/http/jetty/JettyLoggerAdapter.java @@ -143,7 +143,7 @@ public class JettyLoggerAdapter extends AbstractLogger { int bracesIndex = msg.indexOf(braces, start); if (bracesIndex < 0) { builder.append(msg.substring(start)); - builder.append(" "); + builder.append(' '); builder.append(arg); start = msg.length(); } else { diff --git a/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/DubboTestChecker.java b/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/DubboTestChecker.java index 5a065aac2b..846d01a8ad 100644 --- a/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/DubboTestChecker.java +++ b/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/DubboTestChecker.java @@ -297,7 +297,7 @@ public class DubboTestChecker implements TestExecutionListener { public static String getFullStacktrace(Thread thread, StackTraceElement[] stackTrace) { StringBuilder sb = new StringBuilder("Thread: \"" + thread.getName() + "\"" + " Id=" + thread.getId()); - sb.append(" ").append(thread.getState()); + sb.append(' ').append(thread.getState()); sb.append('\n'); if (stackTrace == null) { stackTrace = thread.getStackTrace();