после профилирования много я выяснил, что этот метод занимает большую часть% времени вычисления. Я не вижу способа оптимизировать, так как это ужасная функция. (это...) Может быть, кто-то может показать мне какую-нибудь приятную идею?
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мин.
Я буду держать этот вопрос открытым, чтобы увидеть, есть ли другие идеи, но затем принять один ответ.
Редактировать: Я сейчас расстроен. Я использую TreeViewer JFace, чтобы позволить пользователю просматривать результаты, и для обновления требуется больше времени, чем сами вычисления.:/