代码之家  ›  专栏  ›  技术社区  ›  Mark

在Java中,计时代码执行的干净方法是什么?

  •  4
  • Mark  · 技术社区  · 7 年前

    它可以方便地为代码执行计时,这样您就可以知道事情需要多长时间。但是,我发现通常的方法是草率的,因为它应该有相同的缩进,这使得读取实际计时的内容更加困难。

    long start = System.nanoTime();
    
    // The code you want to time
    
    long end = System.nanoTime();
    System.out.printf("That took: %d ms.%n", TimeUnit.NANOSECONDS.toMillis(end - start));
    

    企图

    我想到了以下几点,看起来好多了,有几个优点&缺点:

    • 它将自动打印代码完成后所用的时间

    缺点:

    • 不是这样的 AutoClosable 应该被使用(非常确定)
    • 它创建了一个 TimeCode
    • try 在它外面是不可接近的

    可以这样使用:

     try (TimeCode t = new TimeCode()) {
         // The stuff you want to time
     }
    

    使之成为可能的代码是:

    class TimeCode implements AutoCloseable {
    
        private long startTime;
    
        public TimeCode() {
            this.startTime = System.nanoTime();
        }
    
        @Override
        public void close() throws Exception {
            long endTime = System.nanoTime();
            System.out.printf("That took: %d ms%n",
                    TimeUnit.NANOSECONDS.toMillis(endTime - this.startTime));
        }
    
    }
    

    • 我的方法真的像我想的那么糟糕吗
    • 有没有更好的方法来计时Java中的代码执行,在这里您可以清楚地看到正在计时什么,或者我只需要满足于像我的第一个代码块这样的东西。
    4 回复  |  直到 7 年前
        1
  •  3
  •   Joop Eggen    7 年前

    你的解决方案很好。

    public void timeCode(Runnable code) {
        ...
        try {
            code.run();
        } catch ...
        }
        ...
    }
    
    timeCode(() -> { ...code to time... });
    

    您可能希望捕获选中的异常并将它们传递给某个运行时异常或其他什么。

        2
  •  1
  •   Ryan Leach    7 年前

    你的方法很好。我们在专业上使用类似的东西,但都是用C#写的。

    https://github.com/aikar/minecraft-timings 对于为minecraft modding(用java编写)执行此操作的库。

        3
  •  1
  •   Lii bob    7 年前

    我认为问题文本中建议的解决办法是 太间接和不惯用

    两个 Guava project 以及 Apache Commons 包括 . 如果您使用其中任何一个,代码将更易于阅读和理解,而且这些类也有更多的内置功能。

    即使不使用try with resource语句,被度量的部分也可以 封闭在一个街区里 为了提高清晰度:

    // Do things that shouldn't be measured
    
    {
        Stopwatch watch = Stopwatch.createStarted();
    
        // Do things that should be measured
    
        System.out.println("Duration: " + watch.elapsed(TimeUnit.SECONDS) + " s");
    }
    
    推荐文章