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

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

性能测试代码

Golang 性能测试代码

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup
	start := time.Now().UnixNano()
	maxCount := 100 //调整并行数量, 调整测试规模
	for i := 0; i < maxCount; i++ {
		count := i
		wg.Add(1)
		go func() {
			defer wg.Done()
			value := fibonacci(50) //fibonacci 递归算法;  fibonacciV2 非递归算法
			if count > maxCount-3 {
				fmt.Println(value) //减少不必要的输出, 减少因屏幕输出对测试结果的影响
			}
		}()
	}
	wg.Wait()
	end := time.Now().UnixNano()
	fmt.Printf("Time Consume: %v", (end-start)/1e6)
}

func fibonacci(i int64) int64 {
	if i < 2 {
		return i
	}
	return fibonacci(i-2) + fibonacci(i-1)
}

func fibonacciV2(i int64) int64 {
	if i < 2 {
		return i
	}
	var first, second, result, j int64
	first = 0
	second = 1
	result = 0
	for j = 2; j <= i; j++ {
		result = first + second
		first = second
		second = result
	}
	return result
}

Java性能测试代码

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Hello {

        public  static void main(String[] args){
            long start = System.currentTimeMillis();
            ExecutorService threadPool = Executors.newFixedThreadPool(64);
            int maxCount = 100;
            final CountDownLatch countDownLatch = new CountDownLatch(maxCount);
            List<Thread> workerList = new ArrayList<>();
            for(int i=0;i<maxCount;i++) {
                int count = i;
                threadPool.execute(new Runnable() {
                    @Override
                    public void run() {
                        long value = fibonacci(50);
                        if (count>maxCount - 3){
                            System.out.println(value);
                        }
                        countDownLatch.countDown();
                    }
                });
            }
            try {
                countDownLatch.await();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            threadPool.shutdown();
            long end = System.currentTimeMillis();
            System.out.println("Time Consume: "+(end-start));

        }

        static long fibonacci( long i){
            if(i<2) return i;
            return fibonacci(i-2) + fibonacci(i-1);
        }

        static long fibonacciV2( long i){
            if(i<2) return i;
            long first = 0;
            long second = 1;
            long result = 0;
            for(int j=2;j<=i;j++){
                result = first + second;
                first = second;
                second = result;
            }
            return result;
        }
}

测试场景与测试结果

并行场景测试

测试场景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 表现的更加优秀

性能基准测试的原理

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据引用中提到的文章,《golang java 对比_golang编程语言java性能对比》,可以进一步了解GolangJava并发情况下的性能对比。引用中的文章《GolangJava各方面使用对比(下)》也提供了对GolangJava的比较。根据这些参考内容,我们可以得出以下结论: Golang相对于Java并发方面具有更好的性能Golang通过goroutine和channel的机制实现高效的并发编程,而Java的线程模型在大量并发情况下可能会导致性能下降。Golang并发模型可以更好地利用多核处理器,并且具有更低的内存占用。 此外,Golang还通过垃圾回收机制和快速编译等特性提供了更高的性能Golang的垃圾回收机制可以在运行时自动回收不再使用的内存,而Java的垃圾回收机制可能会导致一些性能损失。另外,Golang的编译器可以快速编译代码,并且生成的可执行文件相对较小,这也有助于提高性能。 然而,需要注意的是,性能对比不仅仅取决于编程语言本身,还与具体的应用场景和实现方式有关。在某些特定的应用领域中,Java可能具有更好的性能。因此,在选择编程语言时,应根据具体需求和场景来进行评估和选择。 总而言之,根据参考内容,Golang相对于Java并发方面具有更好的性能,并且通过垃圾回收机制和快速编译等特性提供了更高的性能。但是,在具体应用场景中,还需根据需求和场景来进行评估和选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [GolangJava并发性能对比](https://blog.csdn.net/yehuijun/article/details/126223686)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [GolangJava各方面使用对比(上)](https://blog.csdn.net/pbrlovejava/article/details/108920137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值