当前位置:   article > 正文

Golang与Java的并发性能对比_golang java高并发能力

golang java高并发能力

参考《golang java 对比_golang编程语言和java的性能对比》  我们进一步测试Golang和Java的在并发情况下的性能对比

https://blog.csdn.net/weixin_35712223/article/details/114063308

对比测试环境

MacBook Pro, Apple M1 MAX,  10核心(8性能2效能), 内存 32G 

Golang, go version

go version go1.18.3 darwin/amd64

Java, java -version

  1. java version "11.0.15" 2022-04-19 LTS
  2. Java(TM) SE Runtime Environment 18.9 (build 11.0.15+8-LTS-149)
  3. Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.15+8-LTS-149, mixed mode)

性能测试代码

Golang 性能测试代码

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. func main() {
  8. var wg sync.WaitGroup
  9. start := time.Now().UnixNano()
  10. maxCount := 100 //调整并行数量, 调整测试规模
  11. for i := 0; i < maxCount; i++ {
  12. count := i
  13. wg.Add(1)
  14. go func() {
  15. defer wg.Done()
  16. value := fibonacci(50) //fibonacci 递归算法; fibonacciV2 非递归算法
  17. if count > maxCount-3 {
  18. fmt.Println(value) //减少不必要的输出, 减少因屏幕输出对测试结果的影响
  19. }
  20. }()
  21. }
  22. wg.Wait()
  23. end := time.Now().UnixNano()
  24. fmt.Printf("Time Consume: %v", (end-start)/1e6)
  25. }
  26. func fibonacci(i int64) int64 {
  27. if i < 2 {
  28. return i
  29. }
  30. return fibonacci(i-2) + fibonacci(i-1)
  31. }
  32. func fibonacciV2(i int64) int64 {
  33. if i < 2 {
  34. return i
  35. }
  36. var first, second, result, j int64
  37. first = 0
  38. second = 1
  39. result = 0
  40. for j = 2; j <= i; j++ {
  41. result = first + second
  42. first = second
  43. second = result
  44. }
  45. return result
  46. }

Java性能测试代码

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.concurrent.CountDownLatch;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6. public class Hello {
  7. public static void main(String[] args){
  8. long start = System.currentTimeMillis();
  9. ExecutorService threadPool = Executors.newFixedThreadPool(64);
  10. int maxCount = 100;
  11. final CountDownLatch countDownLatch = new CountDownLatch(maxCount);
  12. List<Thread> workerList = new ArrayList<>();
  13. for(int i=0;i<maxCount;i++) {
  14. int count = i;
  15. threadPool.execute(new Runnable() {
  16. @Override
  17. public void run() {
  18. long value = fibonacci(50);
  19. if (count>maxCount - 3){
  20. System.out.println(value);
  21. }
  22. countDownLatch.countDown();
  23. }
  24. });
  25. }
  26. try {
  27. countDownLatch.await();
  28. } catch (InterruptedException e) {
  29. throw new RuntimeException(e);
  30. }
  31. threadPool.shutdown();
  32. long end = System.currentTimeMillis();
  33. System.out.println("Time Consume: "+(end-start));
  34. }
  35. static long fibonacci( long i){
  36. if(i<2) return i;
  37. return fibonacci(i-2) + fibonacci(i-1);
  38. }
  39. static long fibonacciV2( long i){
  40. if(i<2) return i;
  41. long first = 0;
  42. long second = 1;
  43. long result = 0;
  44. for(int j=2;j<=i;j++){
  45. result = first + second;
  46. first = second;
  47. second = result;
  48. }
  49. return result;
  50. }
  51. }

测试场景与测试结果

并行场景测试

测试场景Golang耗时(ms)       

Java耗时(ms)

备注

100线程并发

maxCount=100

fibonacci 递归算法

746402472179在有N层调用关系的大型系统里, 还是Java表现的更优

100线程并发

maxCount=100

fibonacciV2 非递归算法

0.66238在调用层次关系更简单的系统里, Golang 表现的更加优秀

算法才是系统优化的王道, 简化是系统优化的精髓。

并行测试期间, 都已经把Apple M1 MAX,  10核心(8性能2效能) 的性能使用到了极限。

单线程测试

测试场景Golang耗时(ms)    Java耗时(ms)备注

单线程

maxCount=1

fibonacci 递归算法

5848440579在有N层调用关系的大型系统里, 还是Java表现的更优

单线程

maxCount=1

fibonacciV2 非递归算法

0.1386在调用层次关系更简单的系统里, Golang 表现的更加优秀

性能基准测试的原理

一定要在相同条件下, 只有一两个条件有差异的情况下, 进行性能对比测试; 因为这样才有可比性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/539747
推荐阅读
相关标签
  

闽ICP备14008679号