Java 代码中的基准测试

2022-09-02 10:41:23

我最近一直在研究基准测试,我一直对记录程序数据等感兴趣。我很想知道我们是否可以实现自己的内存使用代码,并在程序中有效地实现我们自己的时间消耗代码。我知道如何检查代码运行所需的时间:

public static void main(String[]args){
        long start = System.currentTimeMillis();
        // code
        System.out.println(System.currentTimeMillis() - start);
    }

我还研究了健壮的Java基准测试,第1部分:问题,本教程非常全面。显示 的负面影响。然后,本教程建议我们使用(使其更准确?System.currentTimeMillis();System.nanoTime();

我还研究了在Java中确定内存使用情况以了解内存使用情况。该网站显示了如何实现它。提供的代码看起来无效,因为此人正在调用

long L = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();

在此之后,他调用(4 * 4)= 16次。然后再次重复该过程。这不也会占用内存吗?System.gc();

那么,在你的java程序中,是否有可能实现一个有效的基准测试代码呢?


答案 1

是的,可以在java代码中有效地实现性能基准测试。重要的问题是,任何类型的性能基准测试都会增加自己的开销,以及您想要多少开销。System.currentMill..() 是足够好的性能基准,在大多数情况下,nanoTime() 是一个过度的。

对于内存,System.gc 将显示不同运行的不同结果(因为 gc 运行从不得到保证)。我通常使用 Visual VM 进行内存分析(其免费),然后使用 TDA 进行转储分析。

一种侵入性较小的方法是使用面向Aspect的编程。您可以只创建一个在特定注释或一组方法上运行的方面,并编写@Around建议来收集性能数据。

下面是一个小片段:

public class TestAspect {

    @LogPerformance
    public void thisMethodNeedsToBeMonitored(){
        // Do Something
    }
    public void thisMethodNeedsToBeMonitoredToo(){
        // Do Something
    } 
}

@interface LogPerformance{}

@Aspect
class PerformanceAspect{
    @Around("the pointcut expression to pick up all " +
            "the @PerfMonitor annotated methods")
    public void logPerformance(){
        // log performance here
        // Log it to a file
    }
}

答案 2

如果没有一些海森堡效应,就不可能进行基准测试,即您的板凳代码也被测量。但是,如果您以足够高的粒度进行测量,则效果可以忽略不计。


推荐