1 8 9 package test.mx4j.server; 10 11 import java.lang.reflect.Method ; 12 import javax.management.MBeanServer ; 13 import javax.management.ObjectName ; 14 15 import mx4j.MX4JSystemKeys; 16 import test.MX4JTestCase; 17 import test.MutableInteger; 18 19 22 public class BCELMBeanInvokerTest extends MX4JTestCase 23 { 24 private int m_reps; 25 private int m_calls; 26 27 public BCELMBeanInvokerTest(String s) 28 { 29 super(s); 30 } 31 32 protected void setUp() throws Exception 33 { 34 m_reps = 10; 35 m_calls = 50000; 36 } 37 38 protected void tearDown() throws Exception 39 { 40 super.tearDown(); 41 } 42 43 public void testReflectedAttributePerformance() throws Exception 44 { 45 String property = MX4JSystemKeys.MX4J_MBEAN_INVOKER; 46 System.setProperty(property, "mx4j.server.CachingReflectionMBeanInvoker"); 47 MBeanServer server = newMBeanServer(); 48 ObjectName name = new ObjectName ("BCEL:test=performance,type=reflection"); 49 try 50 { 51 MutableInteger integer = new MutableInteger(0); 52 BCELPerformance mbean = new BCELPerformance(integer); 53 server.registerMBean(mbean, name); 54 55 long[] results = new long[m_reps]; 56 for (int i = 0; i < m_reps; ++i) 57 { 58 long start = System.currentTimeMillis(); 59 for (int j = 0; j < m_calls; ++j) 60 { 61 server.getAttribute(name, "Test"); 62 } 63 long end = System.currentTimeMillis(); 64 results[i] = end - start; 65 System.out.println("Reflection result: " + results[i]); 66 } 67 68 if (integer.get() != m_calls * m_reps) 69 { 70 fail("MBean not called !"); 71 } 72 73 long reflectionAverage = 0; 74 for (int i = 1; i < m_reps; ++i) 75 { 76 reflectionAverage += results[i]; 77 } 78 reflectionAverage = reflectionAverage / (m_reps - 1); 79 System.out.println("Reflection Average for getAttribute = " + reflectionAverage); 80 } 81 finally 82 { 83 System.getProperties().remove(property); 84 server.unregisterMBean(name); 85 } 86 } 87 88 public void testReflectedOperationPerformance() throws Exception 89 { 90 String property = MX4JSystemKeys.MX4J_MBEAN_INVOKER; 91 System.setProperty(property, "mx4j.server.CachingReflectionMBeanInvoker"); 92 MBeanServer server = newMBeanServer(); 93 ObjectName name = new ObjectName ("BCEL:test=performance,type=reflection"); 94 try 95 { 96 MutableInteger integer = new MutableInteger(0); 97 BCELPerformance mbean = new BCELPerformance(integer); 98 server.registerMBean(mbean, name); 99 100 long[] results = new long[m_reps]; 101 for (int i = 0; i < m_reps; ++i) 102 { 103 long start = System.currentTimeMillis(); 104 for (int j = 0; j < m_calls; ++j) 105 { 106 server.invoke(name, "test", null, null); 107 } 108 long end = System.currentTimeMillis(); 109 results[i] = end - start; 110 System.out.println("Reflection result: " + results[i]); 111 } 112 113 if (integer.get() != m_calls * m_reps) 114 { 115 fail("MBean not called !"); 116 } 117 118 long reflectionAverage = 0; 119 for (int i = 1; i < m_reps; ++i) 120 { 121 reflectionAverage += results[i]; 122 } 123 reflectionAverage = reflectionAverage / (m_reps - 1); 124 System.out.println("Reflection Average for invoke = " + reflectionAverage); 125 } 126 finally 127 { 128 System.getProperties().remove(property); 129 server.unregisterMBean(name); 130 } 131 } 132 133 public void testBCELAttributePerformance() throws Exception 134 { 135 System.getProperties().remove(MX4JSystemKeys.MX4J_MBEAN_INVOKER); 137 138 MBeanServer server = newMBeanServer(); 139 ObjectName name = new ObjectName ("BCEL:test=performance,type=direct"); 140 try 141 { 142 MutableInteger integer = new MutableInteger(0); 143 BCELPerformance mbean = new BCELPerformance(integer); 144 server.registerMBean(mbean, name); 145 146 long[] results = new long[m_reps]; 147 for (int i = 0; i < m_reps; ++i) 148 { 149 long start = System.currentTimeMillis(); 150 for (int j = 0; j < m_calls; ++j) 151 { 152 server.getAttribute(name, "Test"); 153 } 154 long end = System.currentTimeMillis(); 155 results[i] = end - start; 156 System.out.println("Direct result: " + results[i]); 157 } 158 159 if (integer.get() != m_calls * m_reps) 160 { 161 fail("MBean not called !"); 162 } 163 164 long directAverage = 0; 165 for (int i = 1; i < m_reps; ++i) 166 { 167 directAverage += results[i]; 168 } 169 directAverage = directAverage / (m_reps - 1); 170 System.out.println("Direct Average for getAttribute = " + directAverage); 171 } 172 finally 173 { 174 server.unregisterMBean(name); 175 } 176 } 177 178 public void testBCELOperationPerformance() throws Exception 179 { 180 System.getProperties().remove(MX4JSystemKeys.MX4J_MBEAN_INVOKER); 182 183 MBeanServer server = newMBeanServer(); 184 ObjectName name = new ObjectName ("BCEL:test=performance,type=direct"); 185 try 186 { 187 MutableInteger integer = new MutableInteger(0); 188 BCELPerformance mbean = new BCELPerformance(integer); 189 server.registerMBean(mbean, name); 190 191 long[] results = new long[m_reps]; 192 for (int i = 0; i < m_reps; ++i) 193 { 194 long start = System.currentTimeMillis(); 195 for (int j = 0; j < m_calls; ++j) 196 { 197 server.invoke(name, "test", null, null); 198 } 199 long end = System.currentTimeMillis(); 200 results[i] = end - start; 201 System.out.println("Direct result: " + results[i]); 202 } 203 204 if (integer.get() != m_calls * m_reps) 205 { 206 fail("MBean not called !"); 207 } 208 209 long directAverage = 0; 210 for (int i = 1; i < m_reps; ++i) 211 { 212 directAverage += results[i]; 213 } 214 directAverage = directAverage / (m_reps - 1); 215 System.out.println("Direct Average for invoke = " + directAverage); 216 } 217 finally 218 { 219 server.unregisterMBean(name); 220 } 221 } 222 223 public void testPlainReflectionPerformance() throws Exception 224 { 225 MutableInteger integer = new MutableInteger(0); 226 BCELPerformance mbean = new BCELPerformance(integer); 227 Method test = mbean.getClass().getMethod("test", (Class [])null); 228 229 int factor = 100; 230 int calls = m_calls * factor; 231 232 long[] results = new long[m_reps]; 233 for (int i = 0; i < m_reps; ++i) 234 { 235 long start = System.currentTimeMillis(); 236 for (int j = 0; j < calls; ++j) 237 { 238 test.invoke(mbean, (Object [])null); 239 } 240 long end = System.currentTimeMillis(); 241 results[i] = end - start; 242 System.out.println("Plain reflection: " + (results[i] / factor)); 243 } 244 245 if (integer.get() != calls * m_reps) 246 { 247 fail("MBean not called !"); 248 } 249 250 long directAverage = 0; 251 for (int i = 1; i < m_reps; ++i) 252 { 253 directAverage += results[i]; 254 } 255 directAverage = directAverage / (m_reps - 1); 256 System.out.println("Plain average = " + (directAverage / factor)); 257 } 258 259 public void testBCELPackagePrivate() throws Exception 260 { 261 System.getProperties().remove(MX4JSystemKeys.MX4J_MBEAN_INVOKER); 263 264 MBeanServer server = newMBeanServer(); 265 ObjectName name = new ObjectName ("BCEL:test=package,type=direct"); 266 try 267 { 268 MutableInteger integer = new MutableInteger(0); 269 BCELPerformance mbean = new BCELPerformance(integer); 270 server.registerMBean(mbean, name); 271 272 PackagePrivate arg = new PackagePrivate(); 273 274 server.invoke(name, "testPackagePrivate", new Object []{arg}, new String []{arg.getClass().getName()}); 275 276 if (integer.get() != 1) 277 { 278 fail("MBean not called !"); 279 } 280 } 281 finally 282 { 283 server.unregisterMBean(name); 284 } 285 } 286 287 public interface BCELPerformanceMBean 288 { 289 public void test(); 290 291 public int getTest(); 292 293 public void testPackagePrivate(PackagePrivate param); 294 } 295 296 class PackagePrivate 297 { 298 } 299 300 public static class BCELPerformance implements BCELPerformanceMBean 301 { 302 private MutableInteger m_integer; 303 304 public BCELPerformance(MutableInteger integer) 305 { 306 m_integer = integer; 307 } 308 309 public void test() 310 { 311 m_integer.set(m_integer.get() + 1); 312 } 313 314 public int getTest() 315 { 316 m_integer.set(m_integer.get() + 1); 317 return 0; 318 } 319 320 public void testPackagePrivate(PackagePrivate param) 321 { 322 m_integer.set(m_integer.get() + 1); 323 } 324 } 325 } 326 | Popular Tags |