有趣的优化问题

本贴最后更新于 2292 天前,其中的信息可能已经东海扬尘

先上环境

$ java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

测试代码

public class DemoTest {  
    interface Op {  
        int operate(int d);  
    }  
  
    static class M1 implements Op {  
        @Override  
        public int operate(int d) {  
            return d + 1;  
        }  
    }  
  
    static class M2 implements Op {  
        @Override  
        public int operate(int d) {  
            return d + 1;  
        }  
    }  
  
    public static void callMillion(Op op) {  
        int d = 0;  
        for (int i = 0; i < 1000000; i++) {  
            op.operate(d);  
        }  
    }  
  
    public static void main(String[] args) {  
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);  
        ExecutorService executorService = Executors.newFixedThreadPool(3);  
        // 执行 100W 次 M1
        executorService.submit(() -> {  
            try {  
                cyclicBarrier.await();  
            } catch (InterruptedException | BrokenBarrierException e) {  
                e.printStackTrace();  
            }  
            long start = System.nanoTime();  
            callMillion(new M1());  
            long cost = System.nanoTime() - start;  
            System.out.println("start:" + (start / 1000000) + ", test1: " + cost);  
        });  
        // 执行 100W 次 M2
        executorService.submit(() -> {  
            try {  
                cyclicBarrier.await();  
            } catch (InterruptedException | BrokenBarrierException e) {  
                e.printStackTrace();  
            }  
            long start = System.nanoTime();  
            callMillion(new M2());  
            long cost = System.nanoTime() - start;  
            System.out.println("start:" + (start / 1000000) + ", test2: " + cost);  
        });  
        // 执行 100W 次真实逻辑
        executorService.submit(() -> {  
            try {  
                cyclicBarrier.await();  
            } catch (InterruptedException | BrokenBarrierException e) {  
                e.printStackTrace();  
            }  
            long start = System.nanoTime();  
            int d = 0;  
            for (int i = 0; i < 1000000; i++) {  
                d += 1;  
            }  
            long cost = System.nanoTime() - start;  
            System.out.println("start:" + (start / 1000000) + ", test3: " + cost);  
        });  
        executorService.shutdown();  
    }  
}

可以先心里想一下答案是什么,然后再验证一下,如果出乎了你的意料,欢迎讨论

打赏 10 积分后可见
10 积分 • 1 打赏
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 优化

    不成熟的优化是万恶之源。

    过度优化实则是劣化。

    31 引用 • 173 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • tiangao

    别光看只想不动手啊

    1 回复
  • 其他回帖
  • scmod

    多线程的东西,结果跟 cpu 心情也有关啊...我说每次结果都不一样你信吗...

  • 88250 1

    没看内容 😂

    PS 跑基准测试一定要用 JMH,不然测不准。

    1 回复
  • Not-Found

    emmm,想表达什么啊?

  • 查看全部回帖