是否可以优化此功能?
在分析了大量内容后,我发现此方法占用了大部分计算时间的百分比。我真的没有看到优化的方法,因为它是一个可怕的功能。(它是...)也许有人可以给我一些好主意左右?
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 的查找就是这样进行的。ltq 值从给定的 ltq 函数保持 20 个点,这个近似值应该足够了。
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 次呼叫。
谢谢到目前为止!
编辑2:我不知道该接受哪个答案。:(通过其他一些改进(主要是查找表),9000个声音文件的处理时间从4:30min减少到3:28min。
我会保持这个问题的开放性,看看是否有其他想法,但随后接受一个答案。
编辑:我现在有点沮丧。我使用 JFace 树视图让用户浏览结果,它比计算本身需要更多的时间来更新。:/