背景
今天遇到一个业务,需要对几个目录统计文件数量。分别写了几个扫描的方法,性能对比如下:
代码 | 文件数 | 耗时 |
递归扫描 | 924614 | 66412 |
Files.walk处理 | 924614 | 48800 |
递归任务处理 | 924614 | 27759 |
可以发现使用了任务的方式性能最高,以下是三段不同的代码
普通递归
private final AtomicLong fileCount = new AtomicLong(0);
public void listPathFileCount(String path) {
File sourceFile = new File(path);
if(sourceFile.isDirectory()) {
for (File f : sourceFile.listFiles()) {
listPathFileCount(f.getAbsolutePath())
}
} else {
fileCount .incrementAndGet()
}
}
Files.walk处理
private final AtomicLong fileCount = new AtomicLong(0);
public void fileWalk(String filePath) {
Path startingDir = Paths.get(filePath);
try {
Files.walk(startingDir)
.filter(Files::isRegularFile)
.forEach(path ->
fileCount.incrementAndGet();
} catch (IOException e) {
log.error(e.getMessage(),e);
}
}
RecursiveTask任务处理
private final AtomicLong fileCount = new AtomicLong(0);
public void listPathCount(String filePath) {
File sourceFile = new File(filePath);
if (sourceFile.isDirectory()) {
List<DirectorySizeTask> subTasks = new ArrayList<>();
if (isBetween(getFilters().getDateRange(), sourceFile.getName())) {
for (File f : sourceFile.listFiles()) {
DirectorySizeTask directorySizeTask = new DirectorySizeTask(f.getAbsolutePath());
directorySizeTask.fork();
subTasks.add(directorySizeTask);
if (subTasks.size() >= 10) {
for (DirectorySizeTask subTaskTemp : subTasks) {
subTaskTemp.join();
}
subTasks.clear();
}
}
for (DirectorySizeTask subTask : subTasks) {
if (subTask != null) {
subTask.join();
}
}
}
} else {
fileCount.incrementAndGet();
}
}
有任何问题欢迎私信或者加群