用于10k文件的IO和NIO文件大小方法的Java Microbenchmark

时间:2016-08-29 11:57:19

标签: java performance jmh

我需要使用JMH计算至少10 k文件的Java IO和NIO文件大小以及修改时间api的性能。我需要这个问题的代码。 请指导如何写。

我的一个文件的示例代码如下:

Runnable

提前致谢。

1 个答案:

答案 0 :(得分:2)

假设您要单独测试文件,可以使用注释@Param作为下一步:

@State(Scope.Thread)
public class BenchmarkFileSize {

    @Param("path")
    public String path;

    @Benchmark
    public long io() {
        return new File(path).length();
    }

    @Benchmark
    public  long nio() throws IOException {
        return Files.size(Paths.get(path));
    }

    public static void main(String[] args) throws RunnerException {
        String[] paths = buildPaths();
        Options opt = new OptionsBuilder()
            .include(BenchmarkFileSize.class.getSimpleName())
            .param("path", paths)
            .forks(1)
            .build();

        new Runner(opt).run();
    }

    private static String[] buildPaths() {
        // Here the code to build the array of paths to test
    }
}

如果要一起测试文件,则需要使用@Setup注释的init方法初始化要测试的路径,如下所示:

@State(Scope.Thread)
public class BenchmarkFileSize {

    private List<String> paths;

    @Benchmark
    public long io() {
        long total = 0L;
        for (String path : paths) {
            total += new File(path).length();
        }
        return total;
    }

    @Benchmark
    public  long nio() throws IOException {
        long total = 0L;
        for (String path : paths) {
            total += Files.size(Paths.get(path));
        }
        return total;
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
            .include(BenchmarkFileSize.class.getSimpleName())
            .forks(1)
            .build();

        new Runner(opt).run();
    }

    @Setup
    public void buildPaths() {
        // Here the code to build the list of paths to test and affect it to paths
    }
}

NB:由于您需要测试大量文件,请确保为JVM分配足够的内存,否则会因GC活动或更糟糕的OOME而导致错误的结果