我有一个基本的疑问。通常,我不得不编写使用缓冲文件I / O的应用程序,每次遇到选择缓冲区大小的难题时,我最终都会经过反复试验,结果很糟糕。我想知道是否有任何方法或算法能够像Teracopy在Windows中处理文件时一样,根据基础平台自动确定作业的最佳缓冲区大小。我主要将Qt用于GUI。
如果可能的话,非常感谢C / C++ / C#/ Java中的一个小例子!
谢谢!
参考方案
在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