大家都知道java中,如果想查看一个方法执行具体的时间,最简单的方法就是在方法执行前后使用long System.currentTimeMillis()获取当前的时间,再用时间相减。其实这样获取的时间是相对不精确的。例如在下面的程序中:
long startTime = System.currentTimeMillis();
method();
long endTime = System.currentTimeMillis();
executeTime = endTime - startTime
其实method可以是一个很简单的方法也可以是一个很复杂的方法,在method中,我们可以去修改各种各样的信息,可以去和第三方的jar包进行交互,这样其实他的执行时间有可能会取决于和第三方的交互时间,而第三方的执行时间,有可能还有各种网络连接,数据库连接等相关,所以我们往往是不能很精确的获取这个时间的,最精确的办法是用反射的原理,利用Spring的AOP编程,逐步地去查看每个方法的执行细节所花费的时间,但这样往往很复杂,实际上,Apache中的common框架中的一个工具类org.apache.commons.lang.time StopWatch 可以很好的模拟了秒表,通过它的split方法和getSplitTime方法,可以很好地看出各分步骤对性能下降的贡献值来。
1. 简单的模拟:
watch.start();
logger.info("Start to get information from VCenter: " + vCenter);
try {
vc = inventory.getVCenterInfo();
} catch (Exception e) {
logger.error("cannot get VCenter info: " + vCenter , e);
return;
}
watch.stop();
logger.info(String.format("End to get information from VCenter: %s, spend time:%s(ms) ", vCenter, watch.getTime()));
2. 更加精确的模拟:
- stWatch.start();
- step1();
- stWatch.split();
- System.out.println("Time consumed by step1: "+stWatch.getSplitTime());
- step2();
- stWatch.split();
- System.out.println("Time consumed by step1 and step2: "+stWatch.getSplitTime());
- stWatch.stop();
但如上的代码有些许不足: 每次getSplitTime得到的值都是当前所有步骤的总和,而不是当前这个步骤的耗时值,以上面代码为例,它没有直接地得出step1和step2两个步骤的各自耗。
于是原来基础上加了两个方法(加了方法的源码见附件): splitAndSaveTime和getSplitTimeByStep。这样的演示代码如下:
相关推荐
在Unix系统上,通常可以通过执行`nexus-3.69.0-02/bin/nexus start`来启动服务,而`nexus-3.69.0-02/bin/nexus stop`用于停止服务。为了确保Nexus在系统启动时自动运行,还可以将其设置为系统服务。 Java 17,作为...
`mysql-binlog-connector-java` 是一个用于读取 MySQL 二进制日志(binlog)的Java库,它可以帮助开发者实现实时的数据复制、数据同步以及增量数据收集。在本项目中,我们将深入探讨如何利用这个库来实现这一功能。 ...
此程序能帮助你实现将命令行程序变成服务运行,比如将"java -jar xxx.jar" 放在后台执行。 ./start-stop-daemon --help start-stop-daemon 1.9.18 for Debian - small and fast C version written by Marek ...
在java语言中,使用多线程技术编程时,提出终止一个线程时不采用stop方法的三个原因,并举例加以证明,最后给出了新的解决方法。在java编程过程中,采用多线程技术可以更好地利用系统资源,减少对用户的响应时间,提高系统...
"mysql-connector-java-Redhat-CentOS"这个标题暗示了这是一个针对Red Hat Enterprise Linux或CentOS操作系统的特定版本的MySQL连接器。在Linux环境中,尤其是对于系统管理员和运维人员来说,理解和使用这个驱动是至...
【标题】"busStop-java.rar_javabus手机_公交线路" 涉及的主要知识点是Java编程语言在开发移动端公交查询应用中的应用。这个程序可能是为Android或Java ME平台设计的,因为Java是这两个移动平台常用的开发语言。下面...
【Mac Stop Watch - 开源秒表应用】 Mac Stop Watch 是一款专为苹果Mac用户设计的开源秒表软件。它的设计简洁、易于使用,为用户提供了一个高效的时间追踪工具,尤其适用于那些需要精确计时的场景,比如运动比赛、...
Java Swing Stop Watch是一款基于Java Swing库开发的计时器应用,用于精确地测量时间间隔,常见于编程测试、性能分析或者任何需要计时的场景。这个压缩包包含了一个名为"java.swing.stop.watch"的Java项目,它展示了...
总结来说,Java中记录程序执行时间的方法有多种,可以根据具体需求选择合适的方案。`System.currentTimeMillis()`适合简单场景,`System.nanoTime()`与`TimeUnit`组合提供更高精度,而第三方库如Guava的`Stopwatch`...
terraform-aws-lambda-自动启动-停止cloudwatch-警报 terraform模块,用于定期启用或禁用CloudWatch警报。 为了节省一些AWS成本,通常会在营业时间之外停止非生产资产。 此类操作可能会触发CloudWatch警报,以提醒...
Java数据结构电子书:There are plenty of books that teach introductory data structures. Some of them are very good. Most of them cost money, and the vast majority of computer science undergraduate ...
在"Stop-Watch-js"中,JavaScript代码可能会创建一个`Date`对象来获取当前时间,并在每次计时器更新时与初始时间进行比较,计算出已过去的时间。计时器的启动、暂停和重置功能将通过事件监听器来实现,这些监听器...
本项目“react-native-stop-watch-app”是一个基于React Native实现的秒表应用,提供了实时计时、保存记录和重置功能,非常适合初学者了解如何在React Native中构建功能丰富的用户界面。 1. **React Native基础知识...
在Java中,内存分为堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(PC Register)和本地方法栈(Native Method Stack)五个主要部分。其中,堆是GC的主要工作区域,用于存储对象实例。 GC的主要任务...
3. 唤醒逻辑:在STOP模式下,按键或串口中断发生时,中断服务程序将执行,执行必要的初始化操作,如重置系统计时器,然后恢复正常的程序流程。 在压缩包中的"LYB-051-STOP -串口唤醒OK"文件可能是该例程的源代码,...
在STOP模式下,只有RAM保持供电,以便在唤醒后能迅速恢复程序执行。STM32L051C8T6支持多种STOP模式,可以根据需要选择不同的电源配置来优化功耗。 为了进入STOP模式,开发者通常会使用HAL库中的HAL_PWR_...
- `stop()`: 当Applet不再可见或者浏览器窗口失去焦点时调用,停止Applet的执行。 - `destroy()`: 当Applet不再需要时,此方法被调用来释放Applet占用的资源。 2. **HTML参数传递**: - 通过在`<APPLET>`标签中...
- **年轻代**:由于大多数对象都会在短时间内死亡,因此频繁地在这里执行GC操作可以获得较高的回收率。 - **年老代**:这里存放的是生命周期较长的对象。由于这些对象存活的概率较高,因此对这里的GC操作次数相对较...
开发者可能定义了一个或多个类来封装提醒逻辑,比如“Reminder”类,它可能有start()方法启动提醒,stop()方法停止提醒,以及setReminderTime()方法设置提醒时间等。此外,还可能有“ReminderTask”类,继承自...