我有以下 java 代码。我正在尝试优化功能
while(pStart < audio.length) {
int pEnd = Math.round(pStart + winSize*Fs);
int windowEnd = Math.min(pEnd, audio.length);
double[] window = new double[fftSize*2];
for(int i = pStart; i < windowEnd; i++) {
window[(i-pStart)*2] = audio[i];
}
fft.complexForward(window);
double fftVal;
for(int i = 0; i < fftSize/2; i++) {
fftVal = Math.sqrt((window[i*2] * window[i*2]) + (window[i*2+1] * window[i*2+1] ));
powerAll[i][index] = 20 * Math.log10(
Math.abs(fftVal) / (windowEnd - pStart));
}
index++;
pStart = pStart + windowSlide;
}
根据跟踪文件计时:
总计 2500 毫秒 fft ~500 毫秒 自 ~900 毫秒 第二个 for 循环 ~900 ms
所以,我现在的重点是优化第二个 for 循环。我无法更改 fft 函数。
在同一问题上,我不确定为什么跟踪器报告“ self ”为 900 毫秒。
最佳答案
您的代码很容易成为并行化目标。您可以:
- 手工完成,计算传递给每个线程的子数组索引;
- 使用
ForkJoin
为您处理许多方面; - 使用刚刚发布的 Java 8 并将其编写为
parallelStream
处理任务。
我的选择肯定是第 3 个,如果没有别的,那就是为了好玩。
我花了一些时间使用 jmh 在我的设置上测量你的代码。 window
数组的每个条目需要 14 纳秒。考虑到完成的计算量,我认为这已经是一个很好的结果,无法再有任何显着的改进。
关于java - 使用数学函数优化此 Java 代码的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500141/