после профилирования я обнаружил, что этот метод занимает большую часть времени вычислений. Я не вижу способа оптимизировать, так как это ужасная функция. (это...)
Может быть, кто-то может показать мне хорошую идею или около того?
public static double perceivedLoudness(double L_G, double L_ETQ, double a0) {
double t1 = 1d + 1 / 4d * Math.pow(10d, 0.1d * (L_G - a0 - L_ETQ));
double t2 = Math.pow(t1, 0.25);
return 0.064d * Math.pow(10, 0.025 * L_ETQ) * (t2 - 1);
}
Вот улучшенная версия:
public static double perceivedLoudness(double L_G, double L_ETQ, double a0) {
double x = L_G - a0 - L_ETQ;
double t1 = 0.25 * Math.exp(0.230259 * x) + 1;
double t2 = Math.sqrt(Math.sqrt(t1));
return ltqFactors[(int)L_ETQ] * (t2 - 1);
}
Поиск ltqFactors идет по этому пути. Значения ltqValues содержат 20 точек от данной функции ltq, что приблизительно должно быть достаточным.
for( int i = 0; i < etqValues.length; ++i) {
ltqFactors[(int)etqValues[i]] = 0.064d * Math.exp(etqValues[i] * 0.05756462732485114210d);
}
Редактировать: после дополнительных тестовых прогонов с большим количеством файлов, я набираю скорость ~ 100%:
- Старый: 6,2% при 7000000 звонков
- Новое: 3,2% 8000000 звонков.
Спасибо тебе пока!
Edit2: я не знаю, какой ответ принять. :(
С некоторыми другими улучшениями (в основном справочными таблицами) время обработки для 9000 звуковых файлов сократилось с 4: 30 минут до 3: 28 минут.
Я оставлю этот вопрос открытым, чтобы посмотреть, есть ли другие идеи, но затем приму один ответ.
Редактировать: Я сейчас немного расстроен. Я использую средство просмотра дерева JFace, чтобы позволить пользователю просматривать результаты, и для его обновления требуется больше времени, чем для самих вычислений. : /