Java 10k 文件的 IO 和 NIO 文件大小方法的微基准测试

Java Microbenchmark for IO and NIO file size method for 10k files

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

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

@State(Scope.Thread)
public class MyBenchmark
{
   public String path = new String("/home/demo.txt");

    @Benchmark
     public File baseline()
     {
       return new File(path);
     }


// @Warmup(iterations = 10, time = 3, timeUnit = TimeUnit.SECONDS)
   @Benchmark
   public long getFileSize()
   {
      return new File(path).length();
   }

   @Benchmark
   public  long getFileSize_NIO1() 
   {
      try
      {
         return Files.size(FileSystems.getDefault().getPath(path));
      }
      catch (IOException e)
      { }
      return 0;
   } 


}

提前致谢。

假设您想单独测试文件,可以使用注释 @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
    }
}

注意: 因为你有很多文件要测试,所以确保你为你的 JVM 分配了足够的内存,否则你会因为 GC activity 而得到错误的结果或更糟的 OOME