在java中读取压缩的gzip文件比读取普通文件慢?

时间:2016-10-23 13:51:18

标签: java io

我正在尝试改进我的代码中的文件读取,所以我认为首先对它进行微观标记,我观察到的有趣结果如下所示。 我先解释一下每个基准;使用代码读取文件:

private void read(String source,Blackhole blackhole) throws  IOException {
   byte[] buffer = new byte[512];
   InputStream inputStream = new FileInputStream(source);
   int offset = 0,read = 0;
   while((read = inputStream.read(buffer,0,512))!=-1){
       blackhole.consume(buffer);
       offset+=read;
   }
   System.out.println(offset/(1024*1024) + " MB read");
}

每个benchamark的唯一区别是文件来源,如下所述:

compress = gzip version of orignal file which has on disk size 181MB
normal = actual file of 2.0G
normalCompressSize = actual file truncated to size of compressed file i.e. 181MB

结果

Benchmark                      Mode  Cnt  Score   Error  Units
FileReader.compress            avgt   20  5.722 ± 0.207   s/op
FileReader.normal              avgt   20  1.728 ± 0.010   s/op
FileReader.normalCompressSize  avgt   20  0.160 ± 0.004   s/op

现在,我无法找到为什么压缩文件以如此低的速度读取的原因。我甚至没有使用GzipInputStream来膨胀数据,但是与其他数据相比,它仍然需要花费很多时间,尤其是相同大小的trucated文件。 它发生的具体原因是什么? 如果我错过了任何重要的细节,请告诉我。

编辑:添加了解释基准的片段:

public static void main(String[] args) throws IOException {
  Options opt = new OptionsBuilder()
    .include(".*" + FileReader.class.getSimpleName() + ".*")
    .jvmArgs("-server")
    .forks(1)
    .build();
  try {
    new Runner(opt).run();
  } catch (RunnerException e) {
   e.printStackTrace();
  }
}

基准:

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.SECONDS)
public void compress(Blackhole blackhole) throws IOException {
  read("~/Documents/data.csv.gz",blackhole);
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.SECONDS)
public void normalCompressSize(Blackhole blackhole) throws IOException   {
  read("~/Documents/data181MB.csv",blackhole);
}
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.SECONDS)
public void normal(Blackhole blackhole) throws IOException {
  read("~/Documents/data.csv",blackhole);
}

编辑:更新的字节代码。 最终结果是

Benchmark                      Mode  Cnt  Score   Error  Units
FileReader.compress            avgt   20  0.160 ± 0.005   s/op
FileReader.normal              avgt   20  1.818 ± 0.235   s/op
FileReader.normalCompressSize  avgt   20  0.150 ± 0.001   s/op

0 个答案:

没有答案