几秒钟后,一个方法需要更长的时间来执行

dos*_*214 0 java audio optimization trigonometry

我有这个方法:

public double sineWave(double t) 
{
   return amplitude==0?0:Math.sin(t * frequency * Math.PI*2 + phase) * amplitude;
}
Run Code Online (Sandbox Code Playgroud)

它由另一个类中的另一个方法调用,以生成简单正弦波的样本,然后将其添加到缓冲区中以发送到声卡.t是时候了.由于某种原因,应用程序调用此方法越多,它获得的速度就越慢.它没有任何意义,在15秒之后,它足够慢以使用我的CPU的完整核心并使音频断断续续.

我100%肯定这是一段代码,因为如果我用返回0替换它,运行它(测量System.nanotime())所花费的时间是不变的.

为什么会这样?有什么我可以做的来解决这个问题吗?

rnk*_*rnk 5

根据这里的信息 - 虽然不清楚缓冲区有多大,但每次迭代都会增加t.假设您的频率非常高,那么每次迭代都会增加Sin()参数.检查以确定参数是否不断增加到非常高的值.快速而肮脏的测试显示Sin性能下降 -

public class SinTest {
  public static void main(String args[]) {
    long angle = Long.parseLong(args[0]);
    long startTime = System.nanoTime();
    for(long l=0L; l<=1000000L; l++) {
      Math.sin(angle);
    }
    long estimatedTime = System.nanoTime() - startTime;
    System.out.println(estimatedTime);
  }
}

$ java SinTest 100000
29181000
$ java SinTest 10000000
138598000
Run Code Online (Sandbox Code Playgroud)