1 /* 2 * Copyright 2018 The gRPC Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package io.grpc.internal; 18 19 import com.google.common.util.concurrent.ListenableFuture; 20 import io.grpc.InternalChannelz; 21 import io.grpc.InternalChannelz.ServerStats; 22 import io.grpc.InternalChannelz.SocketStats; 23 import io.grpc.InternalInstrumented; 24 import io.grpc.InternalLogId; 25 import java.util.concurrent.TimeUnit; 26 import org.openjdk.jmh.annotations.Benchmark; 27 import org.openjdk.jmh.annotations.BenchmarkMode; 28 import org.openjdk.jmh.annotations.Mode; 29 import org.openjdk.jmh.annotations.OutputTimeUnit; 30 import org.openjdk.jmh.annotations.Param; 31 import org.openjdk.jmh.annotations.Scope; 32 import org.openjdk.jmh.annotations.Setup; 33 import org.openjdk.jmh.annotations.State; 34 35 /** 36 * Javadoc. 37 */ 38 @State(Scope.Benchmark) 39 public class ChannelzBenchmark { 40 // Number of items already present 41 @Param({"10", "100", "1000", "10000"}) 42 public int preexisting; 43 44 public InternalChannelz channelz = new InternalChannelz(); 45 46 public InternalInstrumented<ServerStats> serverToRemove; 47 48 public InternalInstrumented<ServerStats> serverToAdd; 49 50 public InternalInstrumented<ServerStats> serverForServerSocket; 51 public InternalInstrumented<SocketStats> serverSocketToAdd; 52 public InternalInstrumented<SocketStats> serverSocketToRemove; 53 54 /** 55 * Javadoc. 56 */ 57 @Setup 58 @SuppressWarnings({"unchecked", "rawtypes"}) 59 public void setUp() { 60 serverToRemove = create(); 61 channelz.addServer(serverToRemove); 62 63 serverForServerSocket = create(); 64 channelz.addServer(serverForServerSocket); 65 66 serverSocketToRemove = create(); 67 channelz.addClientSocket(serverSocketToRemove); 68 channelz.addServerSocket(serverForServerSocket, serverSocketToRemove); 69 70 populate(preexisting); 71 72 serverToAdd = create(); 73 serverSocketToAdd = create(); 74 } 75 76 private void populate(int count) { 77 for (int i = 0; i < count; i++) { 78 // for addNavigable / removeNavigable 79 InternalInstrumented<ServerStats> srv = create(); 80 channelz.addServer(srv); 81 82 // for add / remove 83 InternalInstrumented<SocketStats> sock = create(); 84 channelz.addClientSocket(sock); 85 86 // for addServerSocket / removeServerSocket 87 channelz.addServerSocket(serverForServerSocket, sock); 88 } 89 } 90 91 @Benchmark 92 @BenchmarkMode(Mode.SampleTime) 93 @OutputTimeUnit(TimeUnit.NANOSECONDS) 94 public void addNavigable() { 95 channelz.addServer(serverToAdd); 96 } 97 98 @Benchmark 99 @BenchmarkMode(Mode.SampleTime) 100 @OutputTimeUnit(TimeUnit.NANOSECONDS) 101 public void add() { 102 channelz.addClientSocket(serverSocketToAdd); 103 } 104 105 @Benchmark 106 @BenchmarkMode(Mode.SampleTime) 107 @OutputTimeUnit(TimeUnit.NANOSECONDS) 108 public void addServerSocket() { 109 channelz.addServerSocket(serverForServerSocket, serverSocketToAdd); 110 } 111 112 @Benchmark 113 @BenchmarkMode(Mode.SampleTime) 114 @OutputTimeUnit(TimeUnit.NANOSECONDS) 115 public void removeNavigable() { 116 channelz.removeServer(serverToRemove); 117 } 118 119 @Benchmark 120 @BenchmarkMode(Mode.SampleTime) 121 @OutputTimeUnit(TimeUnit.NANOSECONDS) 122 public void remove() { 123 channelz.removeClientSocket(serverSocketToRemove); 124 } 125 126 @Benchmark 127 @BenchmarkMode(Mode.SampleTime) 128 @OutputTimeUnit(TimeUnit.NANOSECONDS) 129 public void removeServerSocket() { 130 channelz.removeServerSocket(serverForServerSocket, serverSocketToRemove); 131 } 132 133 private static <T> InternalInstrumented<T> create() { 134 return new InternalInstrumented<T>() { 135 final InternalLogId id = InternalLogId.allocate("fake-tag"); 136 137 @Override 138 public ListenableFuture<T> getStats() { 139 throw new UnsupportedOperationException(); 140 } 141 142 @Override 143 public InternalLogId getLogId() { 144 return id; 145 } 146 }; 147 } 148 } 149