在java / groovy应用程序中我正在使用org.slf4j.Logger
我喜欢记录方法执行时间并建议使用以下代码
def startTime
LOGGER.isDebugEnabled() {
startTime = System.currentTimeMillis()
}
doSomething()
LOGGER.debug("Execution took {}ms", (System.currentTimeMillis() - startTime))
我认为这段代码很“难看”。 谁能提出更优雅的建议?
答案 0 :(得分:7)
您可以使用此类计算已用时间。
public class StopWatch {
/* Private Instance Variables */
/** Stores the start time when an object of the StopWatch class is initialized. */
private long startTime;
/**
* Custom constructor which initializes the {@link #startTime} parameter.
*/
public StopWatch() {
startTime = System.currentTimeMillis();
}
/**
* Gets the elapsed time (in seconds) since the time the object of StopWatch was initialized.
*
* @return Elapsed time in seconds.
*/
public double getElapsedTime() {
long endTime = System.currentTimeMillis();
return (double) (endTime - startTime) / (1000);
}
}
并像这样使用它:
public class SWTest {
public static void main(String[] args) {
StopWatch stopWatch = new StopWatch();
doSomething();
LOGGER.debug("Execution took in seconds: ", (stopWatch.getElapsedTime());
}
}
答案 1 :(得分:5)
如果你想让代码看起来不那么难看:
更改
def startTime
LOGGER.isDebugEnabled() {
startTime = System.currentTimeMillis()
}
到
def startTime = System.currentTimeMillis()
我不是isDebugEnabled
这些单线的粉丝。没有它,你不会看到任何性能差异。
答案 2 :(得分:3)
您还可以使用AOP和Java注释,使您的代码更清晰。我建议使用@Loggable
注释和jcabi-aspects中的AspectJ方面(我是开发人员):
@Loggable(Loggable.DEBUG)
public String load(URL url) {
// do something
}
将通过SLF4J记录对此方法的所有调用以及所有参数和执行时间。
答案 3 :(得分:3)
当测量2个时间点之间的差异时,您应该使用System.nanoTime(),当您实际感兴趣测量时间(来自纪元值)时,应使用millis变体,而不是当您想要测量时时间的差异尽可能精确。
另见http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime()
返回正在运行的Java虚拟机的当前值 高分辨率时间源,以纳秒为单位。
答案 4 :(得分:3)
目前的建议似乎并没有利用OP正在使用Groovy
这一事实。
这是我的看法:
class CodeTimer {
/**
* Time how long it takes to run a piece of code
*
* @param closure code to execute and time
* @return time elapsed in nano seconds
*/
static final long time(closure) {
long startTime = System.nanoTime()
closure()
return System.nanoTime() - startTime
}
}
用法示例:
def duration = CodeTimer.time({
sql.executeUpdate(QUERY)
})
log.debug("Execution took ${duration}ns")
答案 5 :(得分:0)
如果你使用了春天:
StopWatch watch = new StopWatch();
watch.start();
for(int i=0; i < 1000000; i++){
Object obj = new Object();
}
watch.stop();
System.out.println("Total execution time to create 1000K objects in Java using StopWatch in millis: " + watch.getTotalTimeMillis());