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