math: optimize Hypot function

This CL optimizes the Hypot function by putting the Abs function in
front of the IsInf check. This simplifies the judgment of IsInf.

Benchmarks:
On linux/arm64,
name         old time/op  new time/op  delta
Hypot-160    5.26ns ± 0%  4.53ns ± 0%  -13.84%  (p=0.000 n=4+5)
HypotGo-160  5.19ns ± 0%  4.85ns ± 0%   -6.53%  (p=0.008 n=5+5)

On linux/amd64,
name        old time/op  new time/op  delta
Hypot-44    5.99ns ± 0%  5.99ns ± 0%     ~     (p=0.667 n=5+5)
HypotGo-44  7.46ns ± 0%  6.61ns ± 0%  -11.37%  (p=0.008 n=5+5)

On darwin/arm64,
name       old time/op  new time/op  delta
Hypot-8    3.58ns ± 0%  2.79ns ± 0%  -22.01%  (p=0.008 n=5+5)
HypotGo-8  3.58ns ± 0%  2.79ns ± 0%  -22.15%  (p=0.008 n=5+5)

Change-Id: Id79236e01d9494b6e00bbda3ec08c72caf5ef3c1
Reviewed-on: https://go-review.googlesource.com/c/go/+/414974
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Eric Fang <eric.fang@arm.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
eric fang 2022-06-29 03:09:54 +00:00 committed by Eric Fang
parent 9a029a6915
commit dd7ce26abf
1 changed files with 2 additions and 2 deletions

View File

@ -25,14 +25,14 @@ func Hypot(p, q float64) float64 {
}
func hypot(p, q float64) float64 {
p, q = Abs(p), Abs(q)
// special cases
switch {
case IsInf(p, 0) || IsInf(q, 0):
case IsInf(p, 1) || IsInf(q, 1):
return Inf(1)
case IsNaN(p) || IsNaN(q):
return NaN()
}
p, q = Abs(p), Abs(q)
if p < q {
p, q = q, p
}