`

一个java时间辅助工具类

    博客分类:
  • Java
阅读更多

TimeMeasure是我以前写的一个java 辅助类,开发人员可以用它们在控制台打印任意两个步骤之间的时间消耗。中途可以pause这个时间计数方法,然后再resume回来,pause的时间是不计入到实际方法消耗的时间的。使用方法见TimeMeasure的main方法,另外如果你愿意,可以拓展它用log4j或者其他方式输出到文件。

 

TimeMeasure.java

 

public class TimeMeasure {

    // PTODO create junit test class
    private static HashMap<String, TimeStack> timers;

    private static int indent = 0;

    /**
     * measureActive is true by default. A true value means that all methods calls are processed else no one.
     */
    public static boolean measureActive = true;

    /**
     * display is true by default. A true value means that all informations are displayed.
     */
    public static boolean display = true;

    public static boolean displaySteps = true;



    /**
     * 
     * DOC hywang Comment method "start".
     * 
     * @param idTimer
     */
    public static void begin(String idTimer) {
        if (!measureActive) {
            return;
        }
        init();
        if (timers.containsKey(idTimer)) {
            if (display) {
                System.out.println(indent(indent) + "Warning (start): timer " + idTimer + " already exists"); //$NON-NLS-1$  //$NON-NLS-2$
            }
        } else {
            indent++;
            TimeStack times = new TimeStack();
            timers.put(idTimer, times);
            if (display) {
                System.out.println(indent(indent) + "Start '" + idTimer + "' ..."); //$NON-NLS-1$  //$NON-NLS-2$
            }
        }
    }

    /**
     * 
     * DOC hywang Comment method "end".
     * 
     * @param idTimer
     * @return total elapsed time since start in ms
     */
    public static long end(String idTimer) {
        if (!measureActive) {
            return 0;
        }
        init();
        if (!timers.containsKey(idTimer)) {
            if (display) {
                System.out.println(indent(indent) + "Warning (end): timer " + idTimer + " doesn't exist"); //$NON-NLS-1$  //$NON-NLS-2$
            }
            return -1;
        } else {
            TimeStack timeStack = timers.get(idTimer);
            timers.remove(idTimer);
            long elapsedTimeSinceLastRequest = timeStack.getLastStepElapsedTime();
            if (display && displaySteps) {
                System.out.println(indent(indent) + "End '" + idTimer + "', elapsed time since last request: " //$NON-NLS-1$  //$NON-NLS-2$
                        + elapsedTimeSinceLastRequest + " ms "); //$NON-NLS-1$
            }
            long totalElapsedTime = timeStack.getTotalElapsedTime();
            if (display) {
                System.out.println(indent(indent) + "End '" + idTimer + "', total elapsed time: " + totalElapsedTime + " ms "); //$NON-NLS-1$  //$NON-NLS-2$  //$NON-NLS-3$
            }
            indent--;
            return totalElapsedTime;
        }
    }

    /**
     * 
     * DOC hywang Comment method "timeSinceBegin".
     * 
     * @param idTimer
     * @return total elapsed time since start in ms
     */
    public static long timeSinceBegin(String idTimer) {
        if (!measureActive) {
            return 0;
        }
        init();
        if (!timers.containsKey(idTimer)) {
            if (display) {
                System.out.println(indent(indent) + "Warning (end): timer " + idTimer + " does'nt exist"); //$NON-NLS-1$  //$NON-NLS-2$
            }
            return -1;
        } else {
            long time = timers.get(idTimer).getTotalElapsedTime();
            if (display) {
                System.out.println(indent(indent) + "-> '" + idTimer + "', elapsed time since start: " + time + " ms "); //$NON-NLS-1$  //$NON-NLS-2$  //$NON-NLS-3$
            }
            return time;
        }
    }

    /**
     * 
     * DOC hywang Comment method "timeStep".
     * 
     * @param idTimer
     * @return elapsed time since previous step in ms
     */
    public static long step(String idTimer, String stepName) {
        if (!measureActive) {
            return 0;
        }
        init();
        if (!timers.containsKey(idTimer)) {
            if (display) {
                System.out.println(indent(indent) + "Warning (end): timer " + idTimer + " does'nt exist"); //$NON-NLS-1$  //$NON-NLS-2$
            }
            return -1;
        } else {
            TimeStack timeStack = timers.get(idTimer);
            timeStack.addStep();
            /*
             * trace the timeline of every step,problem is that the code below " Calendar ca = Calendar.getInstance();
             * Date now = ca.getTime();" will cost almost 13ms~15ms
             */
            long time = timeStack.getLastStepElapsedTime();
            if (display && displaySteps) {
                String timerStepName = idTimer + "', step name '" + stepName;
                System.out.println(indent(indent)
                        + "-> '" + timerStepName + "', elapsed time since previous step: " + time + " ms "); //$NON-NLS-1$  //$NON-NLS-2$
            }
            return time;
        }
    }

    public static void pause(String idTimer) {
        if (!measureActive) {
            return;
        }
        init();
        if (!timers.containsKey(idTimer)) {
            if (display) {
                System.out.println(indent(indent) + "Warning (end): timer " + idTimer + " does'nt exist"); //$NON-NLS-1$  //$NON-NLS-2$
            }
            return;
        } else {
            TimeStack time = timers.get(idTimer);
            // long time = times.getElapsedTimeSinceLastRequest();
            time.pause();
            if (display) {
            }
        }
    }

    public static void resume(String idTimer) {
        if (!measureActive) {
            return;
        }
        init();
        if (!timers.containsKey(idTimer)) {
            begin(idTimer);
            return;
        } else {
            TimeStack times = timers.get(idTimer);
            long time = times.getLastStepElapsedTime();
            times.resume();
            if (display) {
            }
        }
    }

    /**
     * DOC hywang Comment method "init".
     */
    private static void init() {
        if (timers == null) {
            timers = new HashMap<String, TimeStack>();
        }
    }

    public static String indent(final int i) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int j = 0; j < i; j++) {
            stringBuilder.append("  "); //$NON-NLS-1$
        }
        return stringBuilder.toString();
    }

 

    public static void main(String[] args) {
        try {
            TimeMeasure.begin("a"); //开始一个计时
            Thread.sleep(500);
            TimeMeasure.step("a", "1"); //开第一个步骤
            Thread.sleep(800);
            TimeMeasure.pause("a");//暂停计时
            Thread.sleep(600);//由于暂停了计时,这600MS不计入a的总时间
            TimeMeasure.step("a", "2");//开始第二步
            TimeMeasure.resume("a"); //计时继续
            Thread.sleep(2000);
            TimeMeasure.end("a");//结束计时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

 

TimeStack.java

 

 

 

class TimeStack {

    long elapsedTime;

    long previousTimeResume;

    long previousElapsedTimeSinceLastStep;

    long previousStepTime;

    boolean isPaused = false;

    private boolean testMode = false;

    private int testModeIndex;

    private long currentElapsedTimeSinceLastStep;

    public TimeStack() {
        previousStepTime = previousTimeResume = getCurrentTime();

    }

    public void setTestMode(boolean testMode) {
        this.testMode = testMode;
    }

    public long getTotalElapsedTime() {
        if (isPaused) {
            return elapsedTime;
        } else {
            return elapsedTime + getCurrentTime() - previousTimeResume;
        }
    }

    public long getLastStepElapsedTime() {
        return previousElapsedTimeSinceLastStep;
    }

    public void pause() {
        if (isPaused) {
            new Exception("Pause can't be done").printStackTrace();
        } else {
            long currentTime = getCurrentTime();
            elapsedTime += currentTime - previousTimeResume;
            currentElapsedTimeSinceLastStep += currentTime - previousStepTime;
            isPaused = true;
        }
    }

    private long getCurrentTime() {

        int[] times = { 0, 20, 50, 120, 230, 370, 390 };

        if (testMode) {
            int time = times[testModeIndex++];
            return time;
        } else {
            return System.currentTimeMillis();
        }
    }

    public void resume() {
        long currentTime = getCurrentTime();
        previousStepTime = previousTimeResume = currentTime;
        isPaused = false;

    }

    public void addStep() {
        long currentTime = getCurrentTime();
        long tempElapsedTime = currentTime - previousStepTime;
        if (isPaused) {
            previousElapsedTimeSinceLastStep = currentElapsedTimeSinceLastStep;
        } else {
            previousElapsedTimeSinceLastStep = currentElapsedTimeSinceLastStep + tempElapsedTime;
        }
        currentElapsedTimeSinceLastStep = 0;
        previousStepTime = currentTime;
    }
}
 

 

分享到:
评论

相关推荐

    java 常用辅助工具类

    - `StringUtils`:Apache Commons Lang库中的一个类,提供了大量的静态方法,用于处理字符串,如检查空值、替换、分割、连接、格式化等。 - `StringEscapeUtils`:同样来自Apache Commons Lang,主要用于转义和...

    一些java常用的工具类

    在Java的集合框架中,ArrayList和LinkedList等集合类虽然强大,但在处理特定任务时,可能需要额外的辅助工具。Java.util.Collections类提供了对集合的一系列操作,如排序、查找、填充等。此外,Guava库(Google ...

    28个java常用的工具类

    标题提到的“28个Java常用的工具类”可能是一个集合,包含了各种实用功能的类。以下是一些常见的Java工具类及其功能的详细说明: 1. **String类**:Java内置的String类提供了大量操作字符串的方法,如concat、...

    Java常用日期辅助类

    在给定的标题“Java常用日期辅助类”中,我们可以推测这篇博文可能探讨了Java中的一些核心日期处理工具,如`java.util.Date`,`java.time`包中的类,以及自定义的日期助手类`DateHelper.java`。 `java.util.Date`是...

    f_java_开发辅助_辅助开发工具_开发辅助工具_android_

    在文件名称列表中,"pandora-master"可能是指Pandora项目,这是一个开源的Android开发辅助框架。Pandora通常包含一系列模块,如日志管理、网络监控、性能统计等,旨在为开发者提供全方位的开发支持。 Pandora的核心...

    java时间工具类,基本上全面的包括常用的关于时间的处理

    Java时间工具类是Java开发中不可或缺的一部分,它们提供了一系列方便的方法来处理日期和时间,使得开发者可以更加高效地进行时间相关的操作。在这个简单的DateUtil.java工具类中,我们可以期待找到一些基本但实用的...

    Java-Android工具类

    本资料“Java-Android工具类”显然是一份包含了多种实用工具类的集合,旨在帮助开发者在Java和Android开发过程中节省时间和精力。 首先,我们来探讨一下SD工具类。在Android系统中,外部存储空间(如SD卡)通常用于...

    JAVA28个常用工具类

    5. **DateUtil.java**: 日期时间工具类,帮助开发者处理日期和时间,如格式化日期、计算两个日期之间的差值、获取当前时间等。通常会使用Java 8的`java.time`包或者旧版的`java.util.Date`和`java.text....

    Java工具类合集

    总之,“Java工具类合集”是一个涵盖广泛、功能丰富的资源,它将帮助开发者简化常见任务,提升代码质量,降低项目复杂性。在实际开发中,合理使用这些工具类,能够大大提高开发效率,使代码更加简洁、可读,同时也有...

    JAVA 工具类 项目

    这意味着工具类只有一个全局访问点,且不允许通过构造函数创建实例,以确保其静态方法的独立性。 5. **线程安全**:考虑到多线程环境,工具类中的方法需要考虑线程安全问题。如果方法涉及共享状态,那么它们需要被...

    java实体类生成工具

    2. 表选择与映射:用户可以选择一个或多个表,工具会将表的字段映射为实体类的属性。此外,还可以配置实体类的命名规则,如表名转换为驼峰命名或下划线命名。 3. 注解支持:实体类通常会包含诸如`@Entity`(JPA)、...

    28个java常用的工具类源码

    1. **ArrayList和LinkedList**: 这两个类是Java集合框架中的重要部分,分别实现了List接口。ArrayList基于动态数组,适用于随机访问,而LinkedList基于双向链表,适合于频繁插入和删除。 2. **HashMap和TreeMap**: ...

    java utils 工具类

    JavaUtils工具类是Java开发中常见的一类辅助代码集合,它们通常包含各种静态方法,用于简化常见的编程任务,提高开发效率。这篇博文链接(已提供但无法直接访问)可能详细探讨了JavaUtils工具类的设计原则、常用方法...

    java操作工具类

    这些工具类通常包含了对字符串、数组、集合、日期时间等基本数据类型的操作,以及文件I/O、网络通信、线程控制等更复杂功能的辅助方法。下面将详细介绍`opslabJutil-master`这个工具类库可能包含的一些核心知识点。 ...

    java常用工具类集合(也有转自他人的)

    总结来说,"java常用工具类集合"是一个涵盖了多种实用工具类的资源,包括但不限于字符串处理、集合操作、日期时间、IO操作等多个方面。通过学习和应用这些工具类,开发者能够更高效地编写代码,同时也能从开源社区中...

    java常用工具类已经打成jar包包含源码

    总的来说,这个"java常用工具类已经打成jar包包含源码"的资源,是一个非常有价值的开发辅助工具,它提供了大量预封装的实用函数,方便了Java开发,并且源码的开放性使得学习和定制成为可能,对于提升开发效率和代码...

    31个java工具类大汇总

    `StringUtils`是Apache Commons Lang库中的一个核心工具类,专门用于处理字符串。它提供了大量的静态方法,例如检查字符串是否为空、去除两端空白字符、分割字符串、替换子串、比较字符串等,极大地增强了Java标准...

    java类查找小工具

    Java的类加载器是基于“双亲委托模型”工作的,当试图加载一个类时,它会先询问父类加载器是否已经加载过该类,只有当父类加载器无法找到时,才会尝试自己加载。这个过程确保了核心类库的稳定性和安全性。 Java类...

Global site tag (gtag.js) - Google Analytics