You only checking speed, you need to check memory and cpu too. Java is faster because it allocate too much memory and If your tests during a lot of time you will see the performance degrade, Go in other hand grow and use less memory. My explanation is not complete, But I am a Java developer and all system that I did with Java, when I put database driver, serialization and etc, performs much lower than Go.
Em qui, 24 de jan de 2019 às 22:21, Topget <topget1...@gmail.com> escreveu: > 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. > -- 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.