java 文件 缓冲区大小_java – 自动为文件I / O选择缓冲区大小

在Java中,最佳值通常在L1高速缓存大小附近,通常为32 KB.在Java中,至少选择1024字节或1 MB没有太大区别(<20%) 如果您按顺序读取数据,通常您的操作系统足够智能,可以检测到这些并为您预取数据. 你能做的是以下几点.该测试似乎显示使用的块大小的显着差异.

public static void main(String... args) throws IOException {

for (int i = 512; i <= 2 * 1024 * 1024; i *= 2)

readWrite(i);

}

private static void readWrite(int blockSize) throws IOException {

ByteBuffer bb = ByteBuffer.allocateDirect(blockSize);

long start = System.nanoTime();

FileChannel out = new FileOutputStream("deleteme.dat").getChannel();

for (int i = 0; i < (1024 << 20); i += blockSize) {

bb.clear();

while (bb.remaining() > 0)

if (out.write(bb) < 1) throw new AssertionError();

}

out.close();

long mid = System.nanoTime();

FileChannel in = new FileInputStream("deleteme.dat").getChannel();

for (int i = 0; i < (1024 << 20); i += blockSize) {

bb.clear();

while (bb.remaining() > 0)

if (in.read(bb) < 1) throw new AssertionError();

}

in.close();

long end = System.nanoTime();

System.out.printf("With %.1f KB block size write speed %.1f MB/s, read speed %.1f MB/s%n",

blockSize / 1024.0, 1024 * 1e9 / (mid - start), 1024 * 1e9 / (end - mid));

}

版画

With 0.5 KB block size write speed 96.6 MB/s, read speed 169.7 MB/s

With 1.0 KB block size write speed 154.2 MB/s, read speed 312.2 MB/s

With 2.0 KB block size write speed 201.5 MB/s, read speed 438.7 MB/s

With 4.0 KB block size write speed 288.0 MB/s, read speed 733.9 MB/s

With 8.0 KB block size write speed 318.4 MB/s, read speed 711.8 MB/s

With 16.0 KB block size write speed 540.6 MB/s, read speed 1263.7 MB/s

With 32.0 KB block size write speed 726.0 MB/s, read speed 1370.9 MB/s

With 64.0 KB block size write speed 801.8 MB/s, read speed 1536.5 MB/s

With 128.0 KB block size write speed 857.5 MB/s, read speed 1539.6 MB/s

With 256.0 KB block size write speed 794.0 MB/s, read speed 1781.0 MB/s

With 512.0 KB block size write speed 676.2 MB/s, read speed 1221.4 MB/s

With 1024.0 KB block size write speed 886.3 MB/s, read speed 1501.5 MB/s

With 2048.0 KB block size write speed 784.7 MB/s, read speed 1544.9 MB/s

此测试未显示的是硬盘驱动器仅支持60 MB / s读取和40 MB / s写入.您正在测试的是缓存内外的速度.如果这是您唯一的优先级,您将使用内存映射文件.

int blockSize = 32 * 1024;

ByteBuffer bb = ByteBuffer.allocateDirect(blockSize);

FileChannel out = new FileOutputStream("deleteme.dat").getChannel();

for (int i = 0; i < (1024 << 20); i += blockSize) {

bb.clear();

while (bb.remaining() > 0)

if (out.write(bb) < 1) throw new AssertionError();

}

out.close();

long start = System.nanoTime();

FileChannel in = new FileInputStream("deleteme.dat").getChannel();

MappedByteBuffer map = in.map(FileChannel.MapMode.READ_ONLY, 0, in.size());

in.close();

long end = System.nanoTime();

System.out.printf("Mapped file at a rate of %.1f MB/s%n",

1024 * 1e9 / (end - start));

版画

Mapped file at a rate of 589885.5 MB/s

这是如此之快,因为它只是将OS磁盘缓存中的数据直接映射到应用程序的内存中(因此不需要复制)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值