如何获得方法的执行时间?是否有Timer实用程序类用于计算任务需要多长时间等等?
Google上的大多数搜索会返回计划线程和任务的计时器的结果,这不是我想要的.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#currentTimeMillis()说:
以毫秒为单位返回当前时间.请注意,虽然返回值的时间单位是毫秒,但值的粒度取决于底层操作系统,并且可能更大.例如,许多操作系统以几十毫秒为单位测量时间.
我不清楚我是否保证这段代码将始终打印不断增加(或相同)的数字.
while (1) {
System.out.println(System.currentTimeMillis() );
}
Run Code Online (Sandbox Code Playgroud) 以下代码:
String str1="asdfavaxzvzxvc";
String str2="werwerzsfaasdf";
Object c=str1;
Object d=str2;
System.out.println(c);
long time1=System.currentTimeMillis();
for(int i=0;i<1000000000;i++){
if(c.equals(d)){
//System.out.println("asfasdfasdf"); // line 9
}
}
long time2=System.currentTimeMillis();
System.out.println("time taken in this is "+(time2-time1));
Run Code Online (Sandbox Code Playgroud)
当我取消对第9行的注释时,如果条件为真则打印,但是由于两个对象不相等都不会发生,所以它需要5000+毫秒,令我惊讶的是只需注释它只需要5毫秒,我没有理由,为什么它需要这么多时间,如果没有评论,因为它永远不会被执行...
这是某种分支预测效果吗?或任何类型的编译器优化
我的目标是编写一个框架,用于测量方法执行或事务时间以及处理测量,即存储,分析等.事务可能包括调用外部系统,同步或异步等待结果.
关于这个话题已经存在一些问题,比如
所有的答案归结为三种方法来花时间
System.currentTimeMillis()System.nanoTime()Instant.now()和Duration(自Java 8以来)我知道,所有这些都有一些影响
该方法的结果取决于平台.在Linux上你获得1ms的分辨率,在Windows中你得到10ms(单核)~15ms(多核).因此,可以测量大型运行操作或短期运行操作的多次执行.
你得到一个高分辨率的时间测量,具有纳秒精度(但不一定是纳秒精度),并且在292年之后你会得到溢出(我可以忍受它).
从Java 8开始,就有了新的时间API.瞬间有第二个和第二个纳米字段,因此它在对象引用的顶部使用两个长值(相同Duration).您还可以获得纳秒精度,具体取决于基础时钟(请参阅" 具有纳秒分辨率的Java 8 Instant.now()? ").实例化是通过调用Instant.now()哪些映射到System.currentTimeMillis()正常的系统时钟来完成的.
鉴于事实,很明显,最佳精确度只能通过实现System.nanoTime(),但我的问题更多地针对处理一般措施的最佳做法,这不仅包括采取措施,还包括措施处理.
Instant和Duration提供最佳API支持(计算,比较等),但在标准情况下具有os-dependend精度,内存和创建度量的更多开销(对象构造,更深的callstack)
System.nanoTime()和System.currentTimeMillis()具有不同的精度级别,但只有基本的"api"支持(数学操作为long),但更快和更小以保持在内存中.
那么最好的方法是什么?有没有我没想过的含义?还有其他选择吗?
我想计算我的Java程序的执行时间,我很困惑我应该怎么做.我知道可以使用System.nanoTime()和System.currentTimeInMillis()计算经过的时间,但是这种方法没有考虑操作系统的基础调度机制.
例如:假设有3个进程同时运行(假设它是一个单核心系统)
过程A.
进程B(我的Java代码 - 在JVM进程中运行)
过程C.
现在,如果进程B在上午11:00开始执行并在上午11:02完成执行,则System.nanoTime()和System.currentTimeInMillis()将报告所花费的时间为2分钟.但是,过程B可能不会在整个2分钟的持续时间内运行,因为操作系统将安排另外2个进程,并且它们将在2分钟的时间间隔内运行一段时间.所以本质上java程序运行不到2分钟.
有没有办法确定Java程序本身完成执行所花费的确切时间?注意 :
我们可以多次运行代码并花费平均时间来最小化这种情况的影响,仍然很高兴知道是否有一些可靠的方法来计算执行时间
让我们假设我们需要时间的代码部分不能分解成更小的块并且需要花费大量时间来处理.