Единственный способ получить время без отражений - это вызвать метод без отражений. Это потому, что метод настолько тривиален, что попытка его мониторинга создаст больше накладных расходов, чем фактический метод, и даст вам скорость мониторинга метода, а не скорость метода.
public static int addMe(int a, int b) {
return a + b;
}
public static void main(String args[]) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
Method addMe = CustomeMath.class.getMethod("addMe", int.class, int.class);
int result = (Integer) addMe.invoke(null, 37, 47);
System.out.println(result);
int runs = 10000000;
{
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
addMe(i, 10);
long time = System.nanoTime() - start;
System.out.printf("The average call time was %.1f ns%n", (double) time / runs);
}
{
long start = System.nanoTime();
for (int i = 0; i < runs; i++)
addMe.invoke(null, i, 10);
long time = System.nanoTime() - start;
System.out.printf("The average call time using reflections was %.1f ns%n", (double) time / runs);
}
}
печать
84
The average call time was 1.4 ns
The average call time using reflections was 670.1 ns
Домашнее задание для вас;
- Можете ли вы предположить, почему существует такая разница?
- Почему вы можете получить другой результат в более реалистичном примере?