• 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 workerList = new ArrayList<>();
    13. for(int i=0;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 表现的更加优秀

    性能基准测试的原理

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

  • 相关阅读:
    E056-web安全应用-File Inclusion文件包含漏洞进阶
    联邦学习:按混合分布划分Non-IID样本
    Opencv——颜色模型+通道分离与合并
    vue3弹性布局 类似九宫格排列(多选选项)
    美食杰项目 -- 菜谱大全(二)
    读《长安的荔枝》有感
    记一次stm32开发的环境搭建过程
    操作系统与进程调度
    土耳其商务团一行莅临优积科技考察交流
    webpack详解
  • 原文地址:https://blog.csdn.net/yehuijun/article/details/126223686