Java のパフォーマンスに関する簡単な質問です。ループを書くと
for(int i=0;i<n;++i) buffer[(k++)%buffer.length]=something;
その中で何かが自明ではないデジタルフィルターです。このコードでは、書き込みごとにモジュロ演算を行います。とにかく Java VM がそれをチェックするので、これは少しばかげているように感じます。したがって、ArrayIndexOutOfBounds を使用した構成の方が高速であると想定します (バッファーには 1'000'000 個の数値が含まれているため、オーバーフローが頻繁に発生することはありません)。
int i;
try
{
for(i=0;i<n;++i,++k) buffer[k]=something;
}
catch (ArrayIndexOutOfBounds e)
{
k=0;
for(;i<n;++i,++k) buffer[k]=something;
}
3 つ目の解決策は、どの時点でオーバーフローするかを事前に計算してから、ループを手動で 2 つに分割することです。ループがどこまで進むことができるかを決定するコードは、768 サンプルごとに実行されるため、その観点からすると、catch メソッドよりも遅くなる可能性があります。
ここでの問題は、コードのばかげた重複は別として (パフォーマンスの祭壇で喜んで犠牲にします)、コードが増えていることです。そして、Java は小さなルーチンほど最適化されていないように見えることがよくあります。
私の質問は次のとおりです。最もパフォーマンスの高い戦略は何ですか? このタイプの構成を経験した人はいますか? また、両方のコンストラクトの Android デバイスでのパフォーマンスに光を当てられる人はいますか?