https://golang.org/doc/faq#Why_does_Go_perform_badly_on_benchmark_x

On Friday, January 25, 2019 at 10:21:14 AM UTC+8, Topget wrote:
>
> I have tested several simple functions with Golang and Java. To my 
> surprise, Java sometimes is faster than Golang(especially in recursive 
> function and some function in standard library such as math/rand.Rand). I 
> wonder why. Here is some code I used for test and the result.
>
> Golang code:
>
> package main
>
> import (
>     "fmt"
>     "math/rand"
>     "time"
> )
>
> func calPi(pointCount int) float64 {
>     inCircleCount := 0
>
>     var x, y float64
>     var Pi float64
>
>     for i := 0; i < pointCount; i++ {
>         x = rand.Float64()
>         y = rand.Float64()
>
>         if x*x+y*y < 1 {
>             inCircleCount++
>         }
>     }
>
>     Pi = (4.0 * float64(inCircleCount)) / float64(pointCount)
>
>     return Pi
> }
>
> func fibonacci(c int64) int64 {
>     if c < 2 {
>         return c
>     }
>
>     return fibonacci(c-2) + fibonacci(c-1)
> }
>
> func main() {
>     rand.Seed(time.Now().Unix()) // 初始化随机数
>
>     fmt.Printf("Test 1\n")
>
>     startTime := time.Now()
>
>     result := 0.0
>
>     for i := 0.0; i < 1000000000; i = i + 1 {
>         result += i * i
>     }
>
>     endTime := time.Now()
>
>     fmt.Printf("Result: %v\n", result)
>
>     fmt.Printf("Duration: %v\n", endTime.Sub(startTime))
>
>     fmt.Printf("Test 2\n")
>
>     startTime = time.Now()
>
>     resultInt := fibonacci(50)
>
>     endTime = time.Now()
>
>     fmt.Printf("Result: %v\n", resultInt)
>
>     fmt.Printf("Duration: %v\n", endTime.Sub(startTime))
>
>     fmt.Printf("Test 3\n")
>
>     startTime = time.Now()
>
>     result = 0.0
>
>     for i := 0.0; i < 100000000; i = i + 1 {
>         result += rand.Float64()
>     }
>
>     endTime = time.Now()
>
>     fmt.Printf("Result: %v\n", result)
>
>     fmt.Printf("Duration: %v\n s", endTime.Sub(startTime))
>
>     fmt.Printf("Test 4\n")
>
>     startTime = time.Now()
>
>     result = calPi(100000000)
>
>     endTime = time.Now()
>
>     fmt.Printf("Result: %v\n", result)
>
>     fmt.Printf("Duration: %v s\n", endTime.Sub(startTime))
>
> }
>
>
> the result:
>
> Test 1
> Result: 3.333333328333552e+26
> Duration: 1.449212507s
> Test 2
> Result: 12586269025
> Duration: 1m31.645050682s
> Test 3
> Result: 4.999483069673434e+07
> Duration: 2.534121566s
>  sTest 4
> Result: 3.14147056
> Duration: 5.036491495s s
>
> Java code:
>
> public class Performance {
>
> public static double calPi(int pointCount) {
> int inCircleCount = 0;
>
> double x, y;
> double Pi;
>
> for (int i = 0; i < pointCount; i++) {
> x = Math.random();
> y = Math.random();
>
> if (x * x + y * y < 1) {
> inCircleCount++;
> }
> }
>
> Pi = (4.0 * inCircleCount) / pointCount;
>
> return Pi;
> }
>
> public static double cal(double a, double b, double c) {
> return a * b / (c + 1) + a;
> }
>
> public static long fibonacci(long c) {
> if (c < 2)
> return c;
> return fibonacci(c - 2) + fibonacci(c - 1);
> }
>
> public static void main(String[] args) {
>
> System.out.println("Test 1");
>
> long startTime = System.currentTimeMillis();
>
> double result = 0.0;
>
> for (double i = 0.0; i < 1000000000; i = i + 1) {
> result += i * i;
> }
>
> long endTime = System.currentTimeMillis();
>
> float duration = (float) (endTime - startTime) / 1000;
>
> System.out.println("Result: " + result);
> System.out.println("Duration: " + duration + " s");
>
> System.out.println("Test 2");
>
> startTime = System.currentTimeMillis();
>
> long resultInt = fibonacci(50);
>
> endTime = System.currentTimeMillis();
>
> duration = (float) (endTime - startTime) / 1000;
>
> System.out.println("Result: " + resultInt);
> System.out.println("Duration: " + duration + " s");
>
> System.out.println("Test 3");
>
> startTime = System.currentTimeMillis();
>
> result = 0.0;
>
> for (double i = 0; i < 100000000; i = i + 1) {
> result += Math.random();
> }
>
> endTime = System.currentTimeMillis();
>
> duration = (float) (endTime - startTime) / 1000;
>
> System.out.println("Result: " + result);
> System.out.println("Duration: " + duration + " s");
>
> System.out.println("Test 4");
>
> startTime = System.currentTimeMillis();
>
> result = calPi(100000000);
>
> endTime = System.currentTimeMillis();
>
> duration = (float) (endTime - startTime) / 1000;
>
> System.out.println("Result: " + result);
> System.out.println("Duration: " + duration + " s");
>
> }
> }
>
>
> result:
>
> Test 1
> Result: 3.333333328333552E26
> Duration: 2.948 s
> Test 2
> Result: 12586269025
> Duration: 60.816 s
> Test 3
> Result: 4.9999087237930864E7
> Duration: 2.448 s
> Test 4
> Result: 3.14147284
> Duration: 4.786 s
>
>
> The difference of Test 2 results really shocked me!
>
>

-- 
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