我想创建一个应用程序,例如测量某个代码块的执行时间。在这种情况下,它应该有这样的结构:
public static long measureExecution(String code){
long start = System.nanoTime();
executeCode(code); // <----
long time = System.nanoTime() - start;
return time;
}
我对箭头指定的方法很好奇,我需要某种占位符。该方法应该如何实施?甚至可以在运行Java应用程序中执行自定义Java代码吗?
我认为可以通过某种覆盖其他方法体来完成,但我无法弄清楚如何。
谢谢你的意见!
你可以通过Runnable
:
public static long measureExecution(Runnable code) {
long start = System.nanoTime();
code.run();
long time = System.nanoTime() - start;
return time;
}
在调用方法的位置,使用匿名内部类来包装要测量的代码:
long time = measureExecution(new Runnable() {
@Override
public void run() {
System.out.println("Do something");
}
});
(如果您使用的是Java 8,则可以使用lambda表达式而不是匿名内部类,这将使代码更短且更易于阅读)。
您可以使用OpenHFT / Java-Runtime-Compiler:
https://github.com/OpenHFT/Java-Runtime-Compiler
此外,您可以使用ToolProvider类(编译器API),因为java 1.6:
private Path compileJavaFile(Path javaFile, String className) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, javaFile.toFile().getAbsolutePath());
return javaFile.getParent().resolve(className);
}
您可以使用Dynamic Proxy
来包装您的方法调用,这里是一个示例:
首先,您需要创建InvocationHandler
类:
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("About to invoke " + method + "\n with argument " + args);
Object rv = method.invoke(target, args);
System.out.println(" Call returned " + rv);// here you could print the time instead
return rv;
}
}
然后创建一个工厂来获取对象并使用先前创建的代理将其包装。
public class MyFactory {
public static MyInterface getMyInterface() {
MyInterface mc = new MyClass();
InvocationHandler h = new MyInvocationHandler(mc);
MyInterface mi = (MyInterface) Proxy.newProxyInstance(MyInterface.class.getClassLoader(),
new Class[] { MyInterface.class }, h);
return mi;
}
}
希望对你有所帮助。
这是你想表达的想法吗?
public static void main(String[] args) {
long start1=System.nanoTime();
long t=(1+100000)*10000/2;
System.out.println(t);
long start2=System.nanoTime();
long time=start2-start2;
System.out.println(time);
}