標準のMath.sqrt()
方法は、Javaではすでにかなり高速に見えますが、32ビットfloat
値を処理するときに速度を低下させるだけの64ビット操作が常に含まれるという固有の欠点があります。float
パラメータとしてaを使用し、32ビット演算のみを実行float
し、結果としてaを返すカスタムメソッドを使用して、より適切に実行することは可能ですか?
私が見た:
そしてそれは、Math.sqrt()が一般的に打ちにくいという概念を強化するだけでした。私も見ました:
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
これは、Javaに直接移植するにはあまりにも無知であるという興味深いC ++ / ASMハックの束を私に示しました。sqrt14は、JNI呼び出しの一部として興味深いかもしれませんが。。。
Apache Commons FastMathも調べましたが、そのライブラリはデフォルトで標準のMath.sqrt()になっているようですので、役に立ちません。そして、Yepppがあります!:
しかし、私はまだそれを気にしませんでした。
sqrt
32ビット値の速度を上げる必要はありません。HotSpotJVMが自動的にそれを行います。
JITコンパイラは、f2d -> Math.sqrt() -> d2f
パターンを認識し、それをのsqrtss
代わりに高速のCPU命令に置き換えるのに十分スマートですsqrtsd
。ソース。
ベンチマーク:
@State(Scope.Benchmark)
public class Sqrt {
double d = Math.random();
float f = (float) d;
@Benchmark
public double sqrtD() {
return Math.sqrt(d);
}
@Benchmark
public float sqrtF() {
return (float) Math.sqrt(f);
}
}
そして結果:
Benchmark Mode Cnt Score Error Units
Sqrt.sqrtD thrpt 5 145501,072 ± 2211,666 ops/ms
Sqrt.sqrtF thrpt 5 223657,110 ± 2268,735 ops/ms
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加