首页 > 其他分享 >MethodHandler 不会产生 boxing

MethodHandler 不会产生 boxing

时间:2023-05-05 16:12:28浏览次数:42  
标签:MethodHandler 10000 产生 boxing System int add println out

    static int add(int a, int b){
        return a + b;
    }
    @Test
    public void directAdd() throws Throwable {
        // 编译 31ms
        System.out.println(System.currentTimeMillis());
        int r = 0;
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                r += add(i, j);
            }
        }
        System.out.println(r);
        System.out.println(System.currentTimeMillis());
    }
    @Test
    public void directAddBoxing() throws Throwable {
        // 使用 Integer,引入 boxing unboxing 开销,526ms
        System.out.println(System.currentTimeMillis());
        int r = 0;
        for (Integer i = 0; i < 10000; i++) {
            for (Integer j = 0; j < 10000; j++) {
                r += add(i, j);
            }
        }
        System.out.println(r);
        System.out.println(System.currentTimeMillis());
    }
    @Test
    public void invokeReflectionTest() throws Throwable {
        // 反射 1s127ms
        Method add = RuntimeOptimization.class.getDeclaredMethod("add", int.class, int.class);
        System.out.println(System.currentTimeMillis());
        int r = 0;
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                r += (int) add.invoke(null, i, j);
            }
        }
        System.out.println(r);
        System.out.println(System.currentTimeMillis());
    }
    @Test
    public void invokeMethodHandlerTest() throws Throwable {
        // MethodHandler 210ms
        MethodHandle add = MethodHandles.lookup().findStatic(RuntimeOptimization.class, "add", MethodType.methodType(int.class, int.class, int.class));
        System.out.println(System.currentTimeMillis());
        int r = 0;
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                r += (int) add.invokeExact(i, j);
            }
        }
        System.out.println(r);
        System.out.println(System.currentTimeMillis());
    }

可见 MethodHandler 比boxing/unboxing的编译版本还要快,显然它在编译时消除了boxing开销,也就是说 invokeExact(Object...) 并不会真的 boxing,Object invokeExtract 也不返回 Object 后再 unboxing 到 int。所以不必纠结为何不提供 add.pushInt(a).pushInt(b).invoke() 这样的结构,编译器已经做了这项优化。
当然,再怎么折腾还是比编译版本慢 10 倍,目前没有更好的办法了。

标签:MethodHandler,10000,产生,boxing,System,int,add,println,out
From: https://www.cnblogs.com/inshua/p/17374429.html

相关文章

  • 【AGC】applinking服务接入产生崩溃问题
     【关键字】AGC、applinking、崩溃 【问题描述】开发者反馈在应用中集成了AGC的applinking服务,在打开app时遇到了一些问题。具体如下所述:在接入applinking后,从浏览器中访问短链接,能正常唤起app,但app启动后就崩溃了,崩溃日志如下:​配置如下:1.项目的build.gradle文件中......
  • 当和别人产生不好解决的矛盾时,应该怎么办?
    当矛盾实在无法解决时,可以想办法激化矛盾,将矛盾的利益受损群体扩大(类似于转移矛盾),让更多人和自己站在同一阵营,当矛盾触及别人利益时,自会有人出手帮你解决矛盾。需要注意的是:1.不要形成需要别人二选一的局面,避免引火烧身。然而,矛盾双方是相辅相成的,事实上,解决矛盾任何一方都能是......
  • gson对类进行序列产生堆栈溢出
    1,gson对类进行序列号时产生如下错误现象:Handlerprocessingfailed;nestedexceptionisjava.lang.StackOverflowError原因:gson解析的类存在递归嵌套解决办法:去除嵌套即可......
  • esp-idf_关闭调度产生复位问题
    esp-idf里面关闭freeRtos之后产生的复位问题esp-idf里面需要使用的vTaskSuspendAll吗?一般是不需要的,根据esp官方的回答,esp-idf的大多数都是可重入函数。此外,esp-idf中的大多数API都是可重入的;您根本不应该使用vTaskSuspendAll。(如果你认为无论如何都需要使用......
  • 03 | 写一个能产生斐波那契数列的range——惰性求值
    1.首先为了满足range概念的要求我们需要提供begin()和end()2.begin()和end()返回的应该是迭代器,注意这个地方两种可以返回两种不同类型(c++17后即可)3.为了满足迭代器概念的要求我们提供5个typedef,并根据std::input_iterator_tag类型决定我们要实现的“解引用函数”,......
  • 02 | 产生0,1,2...的序列大致有几种方法
    1.写死的for循环2.生成序列和打印序列分开(占据极大的内存)3.用static来实现(缺点:引入了全局的状态)4.用类来实现(缺点:编写类定义太麻烦)5.使用lambda闭包init6.使用协程注意,此处的协程类是需要自己的实现的。......
  • C#基础 Guid NewGuid 产生重复概率极小的一串编号
     .NETFramework:4.7.2       IDE:VisualStudioCommunity2019        OS:Windows10x64    typesetting:Markdown codeusingSystem;namespaceConsoleApp{classProgram{staticvoidMain(string[]args){......
  • Android_关于程序产生 65535 (64K)的解决办法
    随着应用不断迭代,业务线的扩展,应用越来越大(比如集成了各种第三方sdk或者公共支持的jar包,项目耦合性高,重复作用的类越来越多),相信很多人都遇到过如下的错误:UNEXPECTEDTOP-LEVELEXCEPTION:java.lang.IllegalArgumentException:methodIDnotin[0,0xffff]:65536atco......
  • 【转】MySQL死锁产生的原因和解决方法
    前言最近老顾经常碰到同事说,mysql又死锁了导致业务报错。今天我们就来聊聊死锁以及怎么解决锁类型mysql锁级别:页级、表级、行级表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发......
  • git中 commit 和 pull 的先后顺序问题会产生多余的merge记录
    commit和pull的先后顺序问题最近提交代码,发现一个问题。自己很清楚的记得本次的提交是没有进行合并的。奇怪的死gitlab中的history历史中显示了我对本次进行了Merge合并操作。并且Merge合并操作中显示了很多不是本次对代码的修改。这就很明显了,git自动生成的merge操......