在 Java 中测试不同的文件读取方法
Testing different file read methods in Java
我正在做一些算法分析,我决定测试三种文件读取方法,然后对它们进行基准测试(比较它们的平均执行时间)。首先,我生成了一个 larde 文本文件(数百 MB),然后 运行 每种方法进行十次测试 - 缓冲 reader、正常 IO 读取和内存映射读取:
public static void bufferedRead(String filename) {
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(filename));
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public static void NIORead(String filename) throws IOException {
RandomAccessFile aFile = new RandomAccessFile(filename, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inChannel.read(buffer) > 0) {
buffer.flip();
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
buffer.clear();
}
inChannel.close();
aFile.close();
}
public static void memoryMapRead(String filename) throws IOException {
RandomAccessFile aFile = new RandomAccessFile(filename, "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY,
0, inChannel.size());
buffer.load();
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
buffer.clear();
inChannel.close();
aFile.close();
}
但是,整个过程(3x10 测量)需要很长时间,大约 9 个小时。没错,我没有 SSD 磁盘,但对我来说似乎真的很长,即使对于 400 MB 的文本文件也是如此。我的问题是:那些时间结果是否合理?如果不是,这些实现中是否有任何看起来不正确的地方?
删除 System.out.println(...)
可能会提高基准测试的性能,但请确保对读取 String
做一些事情,这样循环就不会得到优化。
我正在做一些算法分析,我决定测试三种文件读取方法,然后对它们进行基准测试(比较它们的平均执行时间)。首先,我生成了一个 larde 文本文件(数百 MB),然后 运行 每种方法进行十次测试 - 缓冲 reader、正常 IO 读取和内存映射读取:
public static void bufferedRead(String filename) {
BufferedReader br = null;
try {
String sCurrentLine;
br = new BufferedReader(new FileReader(filename));
while ((sCurrentLine = br.readLine()) != null) {
System.out.println(sCurrentLine);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
public static void NIORead(String filename) throws IOException {
RandomAccessFile aFile = new RandomAccessFile(filename, "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (inChannel.read(buffer) > 0) {
buffer.flip();
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
buffer.clear();
}
inChannel.close();
aFile.close();
}
public static void memoryMapRead(String filename) throws IOException {
RandomAccessFile aFile = new RandomAccessFile(filename, "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY,
0, inChannel.size());
buffer.load();
for (int i = 0; i < buffer.limit(); i++) {
System.out.print((char) buffer.get());
}
buffer.clear();
inChannel.close();
aFile.close();
}
但是,整个过程(3x10 测量)需要很长时间,大约 9 个小时。没错,我没有 SSD 磁盘,但对我来说似乎真的很长,即使对于 400 MB 的文本文件也是如此。我的问题是:那些时间结果是否合理?如果不是,这些实现中是否有任何看起来不正确的地方?
删除 System.out.println(...)
可能会提高基准测试的性能,但请确保对读取 String
做一些事情,这样循环就不会得到优化。