728x90

특정 메서드 실행 시간 ,종료 시간을 측정하고 싶을때 우리는 일반적으로 아래와 같은 식으로 작성했었다.

@Around("webLog()")
public Object 실행시간측정해보기(ProceedingJoinPoint joinPoint) throws Throwable {
    long 시작시간 = System.currentTimeMillis();
    long 종료시간 = System.currentTimeMillis();
    webLog.setSpendTime((int) (종료시간 - 시작시간));
}

하지만 spring 에는 더 좋은 객체가 있어서 소개해본다. 바로 StopWatch 라는 요놈...

// StopWatch 하나 만들고 
StopWatch sw = new StopWatch(" 샘플입니다.");
// 시간계산 시작
sw.start("임수수행1");

Thread.sleep(1000);

// 멈추고...
sw.stop();
System.out.printf("임수수행1-->소요시간:%d%s.\n", sw.getLastTaskTimeMillis(), "ms");

sw.start("임수수행2");
Thread.sleep(1100);
sw.stop();

System.out.printf("임수수행2-->소요시간:%d%s.\n", sw.getLastTaskTimeMillis(), "ms");
System.out.printf("임수수행건수:%s,소용총시간:%ss.\n", sw.getTaskCount(), sw.getTotalTimeSeconds());

sw.stop() 함수가 어떻게 되었는지 확인해보면

public void stop() throws IllegalStateException {
	if (null == this.currentTaskName) {
		throw new IllegalStateException("Can't stop StopWatch: it's not running");
	}

	final long lastTime = System.nanoTime() - this.startTimeNanos;
	this.totalTimeNanos += lastTime;
	this.lastTaskInfo = new TaskInfo(this.currentTaskName, lastTime);
	if (null != this.taskList) {
		this.taskList.add(this.lastTaskInfo);
	}
	++this.taskCount;
	this.currentTaskName = null;
}

내부코드는 그냥 System.nanoTime() 함수를 사용한것. 사실 System.currentTimeMillis() 와 별다른 차이는 없어보인다.

찾아보니 Apache commons-lang3 의 StopWatch 라는 비슷한 놈도 있었다.

사용방식은 ...

StopWatch sw = StopWatch.createStarted();
Thread.sleep(1000);
System.out.printf("소용시간:%dms.\n", sw.getTime());

getTime() 외 아래 함수들도 있으니 참고 바란다.

// 시간계산 일시 멈춤
sw.suspend();
System.out.printf("시간계산 일시 멈춤:%dms.\n", sw.getTime());

// 시간계산 복구
sw.resume();
System.out.printf("시간계산 복구:%dms.\n", sw.getTime());

// 시간계산 종료
sw.stop();
System.out.printf("시간계산 종료:%dms.\n", sw.getTime());

// 시간계산 리셋
sw.reset();
System.out.printf("시간계산 리셋:%dms.\n", sw.getTime());

// 시간계산 시작
sw.start();
System.out.printf("시간계산 시작:%dms.\n", sw.getTime());

+ Recent posts