2011-03-11 6 views

답변

4

난 당신이 두 개념 분할해야한다고 생각 : 타이밍에 대한

  • 한 클래스 책임을 (예 : 시작()을// elapsedMillis() (정지 데이터를 기반으로 흥미있는 통계를 생산
  • 한 클래스 담당) 방법)

두 개는 정말 별개의 물건 인 IMO입니다. 함께 테스트 할 때보 다 별도로 테스트하는 것이 훨씬 쉽습니다. 각기 다른 구성 요소에 대해 제 3 자 라이브러리를 찾을 수도있을 것입니다. 또는 기존의 StopWatch 클래스를 사용할 수도 있지만 직접 통계 cruncher를 작성하십시오.

2

Jon Skeet이 대답 한 내용을 따르면서, 다른 사람이 원할 경우를 대비하여 내 생각이 드러났습니다. 당신이 stopWatch.prettyPrint()을 실행하면

public class StopWatch extends org.springframework.util.StopWatch 
{ 
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); 
// ------------------------------ FIELDS ------------------------------ 

org.springframework.util.StopWatch.TaskInfo m_minimumTimeTask = null; 
org.springframework.util.StopWatch.TaskInfo m_maximumTimeTask = null; 
private final String m_id; 

// --------------------------- CONSTRUCTORS --------------------------- 

public StopWatch() 
{ 
    this(""); 
} 

public StopWatch(String id) 
{ 
    super(id); 
    m_id = id; 
} 

@Override 
public void setKeepTaskList(boolean keepTaskList) 
{ 
    throw new UnsupportedOperationException("The task list is always kept to be able to calculate the min, max and average"); 
} 
// -------------------------- PUBLIC METHODS -------------------------- 

public long getMinimumTimeMillis() 
{ 
    if (m_minimumTimeTask != null) 
    { 
     return m_minimumTimeTask.getTimeMillis(); 
    } 
    else 
    { 
     return -1; 
    } 
} 

public long getMaximumTimeMillis() 
{ 
    if (m_maximumTimeTask != null) 
    { 
     return m_maximumTimeTask.getTimeMillis(); 
    } 
    else 
    { 
     return -1; 
    } 
} 


public void stop() throws IllegalStateException 
{ 
    super.stop(); 
    updateMinimumTime(); 
    updateMaximumTime(); 
} 


public String shortSummary() 
{ 
    StringBuilder builder = new StringBuilder(); 
    builder.append("StopWatch '").append(m_id) 
      .append("': running time (millis) = ").append(getTotalTimeMillis()); 

    if (getTaskCount() > 0) 
    { 
     builder.append(LINE_SEPARATOR).append("-----------------------------------------").append(LINE_SEPARATOR); 
     builder.append("min: ").append(m_minimumTimeTask.getTimeMillis()).append(" ms (") 
       .append(m_minimumTimeTask.getTaskName()).append(")").append(LINE_SEPARATOR); 
     builder.append("max: ").append(m_maximumTimeTask.getTimeMillis()).append(" ms (") 
       .append(m_maximumTimeTask.getTaskName()).append(")").append(LINE_SEPARATOR); 
     builder.append("avg: ").append(getAverageTimeMillis()).append(" ms"); 
    } 
    return builder.toString(); 
} 

// -------------------------- PRIVATE METHODS -------------------------- 

private void updateMinimumTime() 
{ 
    if (m_minimumTimeTask == null) 
    { 
     m_minimumTimeTask = getLastTaskInfo(); 
    } 
    else 
    { 
     if (getLastTaskTimeMillis() < m_minimumTimeTask.getTimeMillis()) 
     { 
      m_minimumTimeTask = getLastTaskInfo(); 
     } 
    } 
} 

private void updateMaximumTime() 
{ 
    if (m_maximumTimeTask == null) 
    { 
     m_maximumTimeTask = getLastTaskInfo(); 
    } 
    else 
    { 
     if (getLastTaskTimeMillis() > m_maximumTimeTask.getTimeMillis()) 
     { 
      m_maximumTimeTask = getLastTaskInfo(); 
     } 
    } 
} 

public long getAverageTimeMillis() 
{ 
    if(getTaskCount() > 0) 
    { 
     return getTotalTimeMillis()/getTaskCount(); 
    } 
    else 
    { 
     return -1L; 
    } 
} 
} 

, 그것은 다음과 같이 :

StopWatch 'TestMinMaxAndAverage': running time (millis) = 1100 
----------------------------------------- 
min: 100 ms (run3) 
max: 500 ms (run4) 
avg: 275 ms 
----------------------------------------- 
ms  %  Task name 
----------------------------------------- 
00200 018% run1 
00300 027% run2 
00100 009% run3 
00500 045% run4 
은 스프링 프레임 워크에서 스톱워치 클래스를 사용하여