bxb100 / bxb100.github.io

This is my blog
https://blog.tomcat.run
MIT License
0 stars 0 forks source link

ForkJoinPool 来运行斐波那契递归 #36

Open bxb100 opened 1 year ago

bxb100 commented 1 year ago
    static class ComputeFibonacciTask extends RecursiveTask<Long> {

        private final long n;

        public ComputeFibonacciTask(long n) {
            this.n = n;
        }

        protected Long compute() {
            if (n <= 1) {
                return n;
            } else {
                RecursiveTask<Long> otherTask = new ComputeFibonacciTask(n - 1);
                otherTask.fork();
                Long right = new ComputeFibonacciTask(n - 2).compute();
                return right + otherTask.join();
            }
        }
    }

直接 1000 使用默认的 ForkJoinPool 构造方法, 可以看到由于错误的理解, 分治导致出现 2^1000 - 2 个实例

还有一点注意的是: 默认 pool 的大小是 核心-1, 并且是并行的^2

直接爆炸 💥

某一刻的 profile

image

jprofile active code: https://zhile.io/2022/02/22/jprofiler-license.html

解决方法:

不要用 forkJoinPool 来解决非分治问题^1

bxb100 commented 4 months ago

https://www.bilibili.com/video/BV1fr42157T1/

今天看到处理器调度, 想到和这个关联关系. 可能需要从 CPU L1 cache 这个角度来思考, 为什么有的时候并发和并行并不会带来好的结果