java - 使用数学函数优化此 Java 代码的建议

标签 java

我有以下 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 毫秒。

最佳答案

您的代码很容易成为并行化目标。您可以:

  1. 手工完成,计算传递给每个线程的子数组索引;
  2. 使用 ForkJoin 为您处理许多方面;
  3. 使用刚刚发布的 Java 8 并将其编写为 parallelStream 处理任务。

我的选择肯定是第 3 个,如果没有别的,那就是为了好玩。

我花了一些时间使用 jmh 在我的设置上测量你的代码。 window 数组的每个条目需要 14 纳秒。考虑到完成的计算量,我认为这已经是一个很好的结果,无法再有任何显着的改进。

关于java - 使用数学函数优化此 Java 代码的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22500141/

相关文章:

java - 如何在java中使用扫描仪处理奇怪的输入

java - 正在寻找一个真正好的地方来学习一些直接的 Java 和 'abstract' 概念来帮助 Android!完整的Java初学者:)

Java 连接到在线数据库

java - 如何以编程方式创建 Android ViewStub?

java - 数组到列表的转换和类型转换

java - 返回排序数组中唯一数字的数量

java - 返回第一个括号中出现的单词的正则表达式

java - 如何在 IDE 之外运行 Java Swing 应用程序

java - 依赖于环境变量的测试类

java - 将映射值编码到接口(interface) - 声明 Map <String, List<>> 并分配 HashMap<String, ArrayList<>>()