2011-03-11 11 views
5

मैं एक जावा क्लास की तलाश में हूं जो स्टॉपवॉच को अनुकरण करता है (जैसे Spring's StopWatch या Commons' StopWatch) लेकिन यह न्यूनतम, अधिकतम और औसत समय देगा। पिछले एन रनों के साथ-साथ औसत भी औसत।स्टॉपवॉच क्लास जो न्यूनतम, अधिकतम, औसत, ... बार दिखाती है?

क्या ऐसी कोई चीज है या क्या मैं इसे स्वयं बनाता हूं?

संबंध है,

विम

उत्तर

4

मुझे लगता है कि आप दो अवधारणाओं को विभाजित करना चाहिए: समय के लिए

  • एक वर्ग जिम्मेदार (जैसे start() के साथ/बंद कर दिया()/elapsedMillis () विधि) डेटा के आधार पर दिलचस्प आँकड़े के उत्पादन के लिए
  • एक वर्ग जिम्मेदार

दोनों वास्तव में बहुत अलग चीजें हैं, आईएमओ - और एक साथ से अलग से परीक्षण करना निश्चित रूप से आसान है। आप प्रत्येक अलग घटक के लिए तीसरे पक्ष के पुस्तकालयों को ढूंढने में सक्षम हो सकते हैं - या शायद मौजूदा StopWatch कक्षा का उपयोग करें, लेकिन अपना खुद का आंकड़ा क्रंचर लिखें।

2

जॉन स्कीट ने जो जवाब दिया उसके बाद, यह वही है जो मैं किसी और के मामले में चाहता हूं।

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.prettyPrint() चलाते हैं, यह इस तरह दिखेगा:

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 
यह स्प्रिंग ढांचे से स्टॉपवॉच वर्ग का उपयोग करता है
संबंधित मुद्दे