go java 并发_java和go 对于递归程序(如麻将胡牌算法)并发性能对比测试

1)java

package Demo07_recursive;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

public class Main {

public static int f(int i) {

if (i <= 1) {

return 1;

}

return f(i - 1) + f(i - 2);

}

public static void main(String[] args) {

ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);

long start = System.currentTimeMillis();

for (int i = 0; i <= 20; i++) {

executorService.submit(new Runnable() {

@Override

public void run() {

int ret = f(45);

System.out.println(ret);

long end = System.currentTimeMillis();

System.out.println((end - start) * 1.0 / 1000);

}

});

}

executorService.shutdown();

}

}

/*

1836311903

9.371

1836311903

10.513

1836311903

10.843

1836311903

12.747

1836311903

14.847

1836311903

15.208

1836311903

15.256

1836311903

15.34

1836311903

15.437

1836311903

15.917

1836311903

16.116

1836311903

17.115

1836311903

17.237

1836311903

17.762

1836311903

17.806

1836311903

17.851

1836311903

18.009

1836311903

19.597

1836311903

19.864

1836311903

20.803

1836311903

21.367

*/

从第9s开始有响应,然后直到21s结束

2)go

package main

import (

"fmt"

"runtime"

"time"

)

func f(i int) int {

if i <= 1 {

return 1

}

return f(i-1) + f(i-2)

}

func main() {

num := runtime.NumCPU()

fmt.Println("核心数:", num)

runtime.GOMAXPROCS(num)

start := time.Now().Second()

for i := 0; i <= 20; i++ {

go func() {

fmt.Println(f(45))

end := time.Now().Second()

fmt.Println(start, end, end - start)

}()

}

time.Sleep(time.Second * 100)

}

/*

核心数: 8

1836311903

0 36 36

1836311903

0 37 37

1836311903

0 37 37

1836311903

0 37 37

1836311903

0 37 37

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

1836311903

0 38 38

*/

go则是大约38s左右才全部完成

总结: go是用户级别的线程, java则是内核级别的线程,任务少时真正实现多线程调度。 时间更短。go则是由go专门调度器调度,无法控制。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值