我正在尝试编写一个代码,用于从文件夹中读取120个文件并对其执行一些计算。当我调试代码时,它工作正常,但是,执行时间超过20分钟,我知道这可能是由于代码中的错误。但是,有人可以查看它并建议可能的方法来减少执行时间。如果我应该提供进一步的信息,请告诉我。谢谢。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
public class myclass {
static int total = 1;
static int r = 0;
public static void main(String[] args) {
ArrayList<Double> mysignal = new ArrayList<Double>();
ArrayList<Double> mylist = new ArrayList<Double>();
double x;
double a;
myclass obj = new myclass();
String target_dir = "path for folder";
File dir = new File(target_dir);
File[] files = dir.listFiles();
for (File f : files) {
if (f.isFile()) {
BufferedReader inputStream = null;
try {
inputStream = new BufferedReader(new FileReader(f));
String line;
while ((line = inputStream.readLine()) != null) {
System.out.println(line);
mysignal.add(Double.valueOf(line));
total++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
a = obj.funtioneg(mysignal, total);
mylist.add(r, a);
System.out.println(mylist.get(r));
r++;
}
}
}
public double functioneg(ArrayList<Double> s, int N) {
ArrayList<Double> y = new ArrayList<Double>();
double sum = 0, a1 = 0;
double[] o1 = new double[N - 1];// processed signal
for (int n = 0; n < counter_main - 1; n++) {
for (int k = 0; k < 40; k++) {
if (n - k >= 0) {
a1 = s.get(n - k);
sum = sum + (a1 * a1);// energy
} else
sum = sum + 0;
}
o1[n] = sum;
sum = 0;
}
double sum1 = 0;
double avg;
for (int t = 0; t < counter_main - 1; t++) {
sum1 = sum1 + o1[t];
}
avg = sum1 / N - 1;
return (avg);
}
}
答案 0 :(得分:1)
您需要关闭InputStream
在读取目录中的每个文件后(在try
- catch
块之后)写下语句:
inputStream.close();
答案 1 :(得分:0)
正如andrewdleach指出的那样,你应该关闭你的输入流。
此外,您可能希望尝试Java 8函数Files#walk(请参阅此question)以更有效地浏览文件。
答案 2 :(得分:0)
首先尝试注释掉这一行:
System.out.println(line);
控制台的输出很慢(我的意思是很慢),这条线基本上是将每个处理过的文件的内容复制到控制台。
除此之外,您还可以尝试累积在functioneq()方法和/或其中的一部分(例如使用System.nanoTime())中花费的时间来查找最耗时的部分(或在调试器下运行)并且通过抽样使用分析,这是最简单的分析方法并且非常有效 - 只需重复暂停程序并查看它最常停留的位置。