Java - 记录持续时间的实用方法

时间:2017-02-28 20:02:31

标签: java logging

我正在尝试使用实用程序方法来记录我的java代码中代码块所用的持续时间。请在下面找到实用程序代码,使用实用程序方法记录持续时间和主代码,

实用程序代码:

public static void logDuration(Runnable blockToExec
            , String blockCode) {
    Instant start = Instant.now();
    blockToExec.run();
    Duration duration = Duration.between(start, Instant.now());

    /*
        SAMPLE OUPUT of below print stmt (from JAVA API doc)
        "20.345 seconds"                 -- "PT20.345S
        "15 minutes" (15 * 60 seconds)   -- "PT15M"
        "10 hours" (10 * 3600 seconds)   -- "PT10H"
        "2 days" (2 * 86400 seconds)     -- "PT48H"
     */        
    System.out.println("Time taken to complete <" + blockCode + "> - " + duration.toString());
}

主要代码:

Utils.logDuration(() -> {

    List<PersonInfo> personInfos = persons.stream()
            .flatMap(person -> person.getCurrAndPrevAddrs().stream()
                    .map(addr -> {
                        PersonInfo personInfo = new PersonInfo();
                        personInfo.setName(person.getName());
                        personInfo.setAge(person.getAge());
                        personInfo.setAddrs(addr);              
                        return personInfo;
                    }
            )).collect(Collectors.toList());

}, "Parsing and Splitting Persons list");

示例输出: 完成解析和拆分人员列表所需的时间 - PT0.012S

这似乎工作正常,但我想确保此实现对我的代码执行没有任何不利的不必要的隐藏影响。能告诉我这个实现中的设计缺陷吗?或者如果有任何替代实施,请告诉我。

3 个答案:

答案 0 :(得分:2)

听起来你想要一个秒表实用程序,番石榴有:

Stopwatch watch = Stopwatch.createStarted();
// your code
long elapsed = watch.elapsed(TimeUnit.MILLISECONDS);

除非您想对代码进行基准测试。微观基准就是这样。在这种情况下,JMH是事实上的工具。阅读更多here

答案 1 :(得分:0)

为什么要记录代码执行时间?我宁愿使用像JProfiler这样的分析器来找出瓶颈。无论如何,如果您需要测量时间,可以使用DropWizard Metrics并通过JMX公开这些指标。

读取输出执行时间的日志文件会更方便。

答案 2 :(得分:0)

查看微基准测试框架,例如JMH:JMH是一个Java工具,用于构建,运行和分析用Java和其他针对JVM的语言编写的nano / micro / milli / macro基准测试。