关于java中的耗时计算

时间:2015-12-03 19:45:52

标签: java eclipse bufferedreader filereader

我正在尝试编写一个代码,用于从文件夹中读取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);
  }
}

3 个答案:

答案 0 :(得分:1)

您需要关闭InputStream

在读取目录中的每个文件后(在try - catch块之后)写下语句:

inputStream.close();

答案 1 :(得分:0)

正如andrewdleach指出的那样,你应该关闭你的输入流。

此外,您可能希望尝试Java 8函数Files#walk(请参阅此question)以更有效地浏览文件。

答案 2 :(得分:0)

首先尝试注释掉这一行:

System.out.println(line);

控制台的输出很慢(我的意思是很慢),这条线基本上是将每个处理过的文件的内容复制到控制台。

除此之外,您还可以尝试累积在functioneq()方法和/或其中的一部分(例如使用System.nanoTime())中花费的时间来查找最耗时的部分(或在调试器下运行)并且通过抽样使用分析,这是最简单的分析方法并且非常有效 - 只需重复暂停程序并查看它最常停留的位置。