https://github.com/apache/dubbo/blob/501e4dbdf9d93b8d5b59400cff3bdac5ea89fbc4/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/protocol/AsyncToSyncInvoker.java#L54

The above `result.get()` will eventually delegate to [CompletableFuture.get()](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#get--). I checked the implementation provided in JDK 8, it will first spin-waiting for the countdown of 256 (the eighth power of 2) and then park the thread. I believe it's the unnecessary spin that caused the bad performance.

When running under JDK 11, the performance performs well as the previous versions, I still does not check the difference between these two implementations yet.

Thank @Jeff-Lv for help finding this issue.
throw new RpcException("Interrupted unexpectedly while waiting for remoting result to return!  method: " + invocation.getMethodName() + ", provider: " + getUrl() + ", cause: " + e.getMessage(), e);
        } catch (ExecutionException e) {
            Throwable t = e.getCause();
            if (t instanceof TimeoutException) {
                throw new RpcException(RpcException.TIMEOUT_EXCEPTION, "Invoke remote method timeout. method: " + invocation.getMethodName() + ", provider: " + getUrl() + ", cause: " + e.getMessage(), e);
            } else if (t instanceof RemotingException) {
                throw new RpcException(RpcException.NETWORK_EXCEPTION, "Failed to invoke remote method: " + invocation.getMethodName() + ", provider: " + getUrl() + ", cause: " + e.getMessage(), e);
            }
        } catch (Throwable e) {
            throw new RpcException(e.getMessage(), e);
        }
        return asyncResult;
    }
    @Override
    public URL getUrl() {
        return invoker.getUrl();
    }
    @Override
    public boolean isAvailable() {
        return invoker.isAvailable();
    }
    @Override
    public void destroy() {
        invoker.destroy();
    }
    public Invoker<T> getInvoker() {
        return invoker;
    }
}