经过大量的剖析,我发现这个方法占据了计算时间的大部分%. 我真的看不到优化的方法,因为它是一个可怕的函数。(它是...)也许有人可以给我展示一些好的想法或建议吗?
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保存了来自给定ltq函数的20个点,这应该足够。
for( int i = 0; i < etqValues.length; ++i) {
ltqFactors[(int)etqValues[i]] = 0.064d * Math.exp(etqValues[i] * 0.05756462732485114210d);
}
编辑:经过更多的测试运行和更多的文件,我实现了 ~100% 的加速:
- 旧版:7000000 次调用,6.2%
- 新版:8000000 次调用,3.2%
到目前为止,谢谢你!
编辑2:我不知道该接受哪个答案。:( 通过一些其他的改进(主要是查找表),9000 个声音文件的处理时间从4:30分降至3:28分。
我将继续开放这个问题,看看是否有其他想法,但然后会接受一个答案。
编辑:我有点沮丧。我使用 JFace treeviewer 让用户浏览结果,但它需要比计算本身更多的时间来更新。:/