Since my ASM skills are limited, for positive integers, I'm planning on 
using:

// PowP computes real raised to positive integer xⁿ
func PowP(x float64, n uint32) (r float64) {
if n == 0 {
return 1.0
}
if n == 1 {
return x
}
if n == 2 {
return x * x
}
if n == 3 {
return x * x * x
}
if n == 4 {
r = x * x
return r * r
}
if n == 5 {
r = x * x
return r * r * x
}
if n == 6 {
r = x * x * x
return r * r
}
if n == 7 {
r = x * x * x
return r * r * x
}
if n == 8 {
r = x * x * x * x
return r * r
}
if n == 9 {
r = x * x * x
return r * r * r
}
if n == 10 {
r = x * x * x
return r * r * r * x
}
r = x * x * x
r = r * r * r * x
var i uint32
for i = 11; i <= 20; i++ {
r *= x
if n == i {
return
}
}
return math.Pow(x, float64(n))
}

which gives a speedup of 5-8 times for small positive integers (<20). the 
case of negative integers could be handled too.

output:
BenchmarkPowP10-32         50000000        30.4 ns/op
BenchmarkPowP10std-32     5000000       247 ns/op
BenchmarkPowP20-32         20000000        98.2 ns/op
BenchmarkPowP20std-32     3000000       561 ns/op
BenchmarkPowP200-32        200000     10145 ns/op
BenchmarkPowP200std-32      200000      9231 ns/op

all files are 
here: https://gist.github.com/cpmech/9f871df5b59fa8407221b0d3fb361a3d

I'm also looking at the Cephes library: http://www.netlib.org/cephes/ for 
ideas

maybe we could have a similar function in Go (and many more optimised ones, 
especially for complex numbers...)

cheers
d



On Friday, August 4, 2017 at 4:20:41 PM UTC+10, Dorival Pedroso wrote:
>
> I've noticed that this C code:
>
> #include "math.h"
> int main() {
>         double x = 2.5;
>         int Nmax = 10000000;
>         for (int N=0; N<Nmax; N++) {
>                 for (int i=0; i<20; i++) {
>                         pow(x, i);
>                 }
>         }
> }
>
> can run up to 50x faster than this Go code:
>
> package main
>
> import "math"
>
> func main() {
> x := 2.5
> Nmax := 10000000
> for N := 0; N < Nmax; N++ {
> for i := 0; i < 20; i++ {
> math.Pow(x, float64(i))
> }
> }
> }
>
> The C code was compiled with: gcc -O2 ccode.c -o ccode -lm
> then run with time ./ccode
>
> The Go code was compiled with: go build gcode.go
> then run with  time ./gcode
>
> I've used the time command on Linux (Ubuntu) to get some estimate.
>
> So the question is: how can we make the Go code faster?
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to