【问题标题】:How to find time taken to run a Java program?如何找到运行 Java 程序所花费的时间?
【发布时间】:2011-07-11 06:25:26
【问题描述】:

我有一个我一直在开发的 Java 应用程序,我刚刚意识到该程序必须在不到一分钟的时间内返回一个值,但不知道如何查找或显示运行该程序所用的时间.如何找到运行程序所花费的时间?

【问题讨论】:

  • 很抱歉,您的问题还不够清楚。我认为日食在这里无关紧要。运行时也无关紧要,因为它令人困惑。 JDK 有 Runtime 类,您可以通过调用 Runtime.getRuntime() 来获取它的单例实例,但它似乎不是您想要的。请尝试重新思考您的问题并重新编写。

标签: java eclipse runtime


【解决方案1】:

您可以使用 System.nanoTime() 比较时间。它将以纳秒为单位返回时间。

返回最精确的可用系统计时器的当前值,以纳秒为单位。

你可以这样使用它:

long startTime = System.nanoTime();

// code

long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns"); 

有用的链接:

【讨论】:

    【解决方案2】:

    没有内置方法可以查看您的程序运行了多长时间。但是,您可以在程序开始时只存储当前时间,以便稍后您可以查看已经过去了多少时间。

    public class MyProgram {
        private static long startTime = System.currentTimeMillis();
    
        public static void main(String[] args) {
            // Do stuff...
    
            // At the end
            long endTime = System.currentTimeMillis();
            System.out.println("It took " + (endTime - startTime) + " milliseconds");
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您将 Spring 作为项目的依赖项(或者不介意添加它),则可以使用 StopWatch。顾名思义,一旦初始化,它将计算时间,直到您停止它。然后,您可以检查任务所花费的时间。多个 StopWatches 可以同时用于多个任务,保持代码整洁。

      除了保持代码整洁之外,秒表还有助于格式化时间和其他实用方法。

      public void myMethod(){
          StopWatch stopWatch = new StopWatch();
      
          stopWatch.start("Task1");
          // ...
          // Do my thing
          // ...
          stopWatch.stop();
          System.out.println("Task executed in " + stopWatch.getTotalTimeSeconds() + "s");
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用System类提供的2个API

        1. System.currentTimeMillis() 如果代码耗时在毫秒范围内
        2. System.nanoTime() 如果代码耗时在纳秒范围内

        示例代码

        public class TestTimeTaken {
            public static void main(String args[]) throws InterruptedException{
                long startTimeNanoSecond = System.nanoTime();
                long startTimeMilliSecond = System.currentTimeMillis();
        
                //code
                Thread.sleep(1000);
                //code
        
                long endTimeNanoSecond = System.nanoTime();
                long endTimeMilliSecond = System.currentTimeMillis();
        
                System.out.println("Time Taken in "+(endTimeNanoSecond - startTimeNanoSecond) + " ns");
                System.out.println("Time Taken in "+(endTimeMilliSecond - startTimeMilliSecond) + " ms");
        
        
            }
        }
        

        【讨论】:

          【解决方案5】:

          如果您只想知道程序运行了多长时间,请在程序的开头和结尾使用 System.currentTimeMillis()。

          【讨论】:

            【解决方案6】:

            当我有可用的库时,我喜欢使用 Apache Commons StopWatch 类。

            import org.apache.commons.lang3.time.StopWatch;
            
            // ...
            
            StopWatch stopWatch = new StopWatch();
            String message = "Task : %s (%s) seconds";
            
            // ...
            
            stopWatch.split();
            System.out.println(String.format(message, "10", stopWatch.toSplitString()));
            
            // ...
            
            stopWatch.split();
            System.out.println(String.format(message, "20", stopWatch.toSplitString()));
            
            stopWatch.stop();
            
            

            【讨论】:

              【解决方案7】:

              这是方面的典型用例,例如使用Spring AOP

              @Aspect
              public class TimerAspect {
              
                  private static final Logger LOG = Logger.getLogger(TimerAspect.class);
              
                  @Around("com.xyz.myapp.MyClass.myMethod()")
                  public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
                      long startTime = System.nanoTime();
                      Object retVal = pjp.proceed();
                      long endTime = System.nanoTime();
                      LOG.info(String.format("Call to %s.%s with args %s took %s ns", pjp.getTarget(), pjp.getSignature(), Arrays.toString(pjp.getArgs()), endTime - startTime));
                      return retVal;
                  }
              }
              

              在您的应用程序上下文中:

              <aop:aspectj-autoproxy/>
              <bean id="myAspect" class="org.xyz.TimerAspect"/>   
              

              【讨论】:

                猜你喜欢
                • 2013-08-05
                • 1970-01-01
                • 2019-12-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-12-11
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多