Olá pessoal, mais uma da série de otimização de código:
Tenho um algoritmo muito grande que com um corpus grande demora 3987 milisegundos. Aceito sugestões para ganhar performance, la vái:
public TDMElements getMatrix(FileInputStream f) {
String line = null;
int matrixRows = 0;
int matrixColluns = 0;
List<Integer> nd = new ArrayList<Integer>();
List<Integer> np = new ArrayList<Integer>();
List<String> lista = new ArrayList<String>();
List<String> lines = new ArrayList<String>();
try {
DataInputStream DIi1 = new DataInputStream(f);
BufferedReader in = new BufferedReader(new InputStreamReader(DIi1));
line = in.readLine();
while (line != null) {
lines.add(clearString(line));
StringTokenizer parser = new StringTokenizer(clearString(line));
nd.add(parser.countTokens());
while (parser.hasMoreTokens()) {
String aux = parser.nextToken();
if (!lista.contains(aux.toLowerCase()))
lista.add(aux.toLowerCase());
}
line = in.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
matrixColluns = lines.size();
matrixRows = lista.size();
int k;
for(String sl :lista){
k=0;
for(int j=0; j<lines.size();j++){
if ((' '+(lines.get(j).toLowerCase())+' ').contains(' '+sl+' ')){
k++;
}
}
np.add(k);
}
double[][] array = new double[matrixRows][matrixColluns];
int ig=0;
for (String sl : lista){
for(int j = 0; j < matrixColluns;j++){
StringTokenizer parser = new StringTokenizer(lines.get(j));
while (parser.hasMoreTokens()) {
if (sl.equals(parser.nextToken().toLowerCase())){
array[ig][j] = array[ig][j]+1;
}
}
}
ig++;
}
//TF-IDF
for (int i = 0; i < matrixRows; i++){
for(int j = 0; j < matrixColluns;j++){
if ((nd.get(j)==0) || (np.get(i)==0)){
array[i][j] =0;
}else{
array[i][j] = (array[i][j]/(1.0*nd.get(j)))* Math.log10(matrixColluns * 1.0/np.get(i));
}
}
}
return new TDMElements(lines,lista, new Matrix(array));
}