所以我正在尝试优化我正在使用的一些代码。代码是一个为网站生成器编写的有点通用的搜索实用程序。
目前,搜索通过给定的基本目录搜索字符串,并返回具有该名称的任何目录的最后一个实例,或者它找到的任何非目录的第一个实例。
前:
public static File findFile(File baseDir, String name) throws IOException{
File match = null;
for (File f : findFiles(baseDir, name)){
if (match == null ||
match.isDirectory() ||
matchesFile(name, f) > matchesFile(name, match)){
match = f;
}
}
return match;
}
public static Set<File> findFiles(File baseDir, String name) throws IOException{
Set<File> files = new HashSet<File>();
for (File f : baseDir.listFiles()){
if (!f.isDirectory()){
if (matchesFile(name, f) > 0){
files.add(f);
}
}else{
files.addAll(findFiles(f, name));
if (matchesFile(name, f) > 0){
files.add(f);
}
}
}
if (matchesFile(name, baseDir) > 0){
files.add(baseDir);
}
return files;
}
由于这是一个相当大的构建需要长达一个小时,而我的机器速度很慢,我想稍微优化一下。我想我知道我在做什么,但我实际上并不知道这是否会更快。 我正在考虑改变代码:
public static File findFile(File baseDir, String name) throws IOException{
File match = null;
if(!baseDirHash.containsKey(baseDir.getAbsolutePath())){
baseDirHash.put(baseDir.getAbsolutePath(), baseDir);
hashBaseDir(baseDir, baseDir);
}
match = baseDirHash.get(baseDir.getAbsoluteFile() + name);
if(match == null || !match.exists()){
for (File f : findFiles(baseDir, name)){
if (match == null ||
match.isDirectory() ||
matchesFile(name, f) > matchesFile(name, match)){
match = f;
}
}
}
if(!match.isDirectory()){
baseDirHash.put(baseDir.getAbsoluteFile() + name, match);
}
return match;
}
...
private static void hashBaseDir(File baseDir, File currentDir) throws IOException{
for (File f : currentDir.listFiles()){
if (!f.isDirectory()){
baseDirHash.put(baseDir.getAbsolutePath() + f.getName(), f);
}else{
hashBaseDir(baseDir, f);
}
}
}
任何有关使我的代码更优化的支持或信息,或者我没有想到的问题都会很棒。
答案 0 :(得分:0)
我最终只是实现了它,它的速度提高了大约400%。
编辑: 一些优化可以改善所有代码。
注意:这段代码不是线程安全的,因为我使用的是静态方法和变量。