是否可以在 java jit 上使用 Final boolean 删除跳转?

2024-03-22

正如我们所知,有些人说 java JIT 比 C++ 更快。 我有一些想法,可以利用 JIT 并在运行时代码中删除一些指令。

这是我尝试过的示例代码:

/**
 * Created by kadirbasol on 4/6/14.
 */
public class RemoveJump {
    public final boolean test;

    private static RemoveJump instance = new RemoveJump();

    public static final RemoveJump getInstance() {
        return instance;
    }

    private RemoveJump() {
        //set the test on the constructor once and
        //remove this if statement forever from testLoop
        test = false;
    }


    public final long getData() {
        return 1000000000;
    }

    public final void testLoop() {
        long l = System.currentTimeMillis();
        int ppp = 0;
        long count = System.currentTimeMillis();
        final long data = getData();
        //this loop should be removed from function because
        //RemoveJump set test to false and modified testLoop function
        for (int i = 0; i <  data ; i++) {
            if(test) {
                ppp++;
            }
            if(test) {
                ppp++;
            }
            if(test) {
                ppp++;
            }
            if(test) {
                ppp++;
            }
            if(test) {
                ppp++;
            }
        }
        long lastTime = System.currentTimeMillis() - l;
        System.out.println(lastTime);
        System.out.println(ppp);
    }

    public static void main(String[] args) {
        RemoveJump.getInstance().testLoop();
    }
}

代码中有5个if语句。 是否可以删除函数中的这 5 个检查 if 语句? 构造函数将设置一次最终布尔变量并删除跳转。 构造函数将修改testLoop函数。

但我尝试的代码没有效果。 JIT不是修改代码吗? 为什么 ? 如果没有,我们可以修改构造函数上的 JVM 函数吗? 我听说http://asm.ow2.org http://asm.ow2.org、asm java库,用于生成或修改JVM。


事实上,JIT消除的检查test循环中的字段。尽管 JIT 似乎不够聪明,无法在类型为data与循环索引的类型不同i:

0x000000000222f570: inc    %ebx               ; OopMap{rbp=Oop off=178}
                                              ;*goto
                                              ; - RemoveJump::testLoop@82 (line 28)
0x000000000222f572: test   %eax,-0x20ff578(%rip)        # 0x0000000000130000
                                              ;*iload
                                              ; - RemoveJump::testLoop@20 (line 28)
                                              ;   {poll}
0x000000000222f578: movslq %ebx,%r10
0x000000000222f57b: cmp    %r14,%r10
0x000000000222f57e: jl     0x000000000222f570

如果你改变getData()回来int,优化将会起作用,并且结果汇编中根本不会有循环。

但是,您的测试用例不会显示优化效果,因为循环开始在解释器模式下执行,在执行中间(在循环内部)进行编译,因此即使在编译之后,执行仍保留在循环内部。但是如果你调用你的testLoop()多次,您会看到该方法的进一步调用将立即打印结果,而无需经过循环:

for (int i = 1; i <= 5; i++) {
    System.out.println("Run #" + i);
    RemoveJump.getInstance().testLoop();
}

Run #1
1897
0
Run #2
1895
0
Run #3
0
0
Run #4
0
0
Run #5
0
0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 java jit 上使用 Final boolean 删除跳转? 的相关文章

随机推荐

  • 在 Windows 中查找超过 4GB 的正确文件大小

    我使用此 C 代码来查找 Windows 中某些文件的文件大小 使用 Visual Studio p findFileData gt nFileSizeHigh MAXDWORD p findFileData gt nFileSizeLow
  • Ionic 3 中带有标签的晶圆厂

    我正在使用 Ionic 3 框架 并希望在我的 Ionic 3 应用程序中插入以下类型的 fab 菜单 特别菜单 在您的 SCSS 文件中 button ion fab overflow visible position relative
  • swift 如何在后台在 Watch 和 iPhone 之间共享数据

    我有一个用于在 iPhone 和 Watch 之间共享数据 共享文本 的功能应用程序 我希望即使手表设置在后台 当 Watch 在后台时将数据从 iPhone 发送到 Watch 也能正常工作 我读了很多关于如何做到这一点的内容 但似乎没有
  • 使用 C# 在 TextBox/Label/RichTextBox 中突出显示文本

    晚安 我想知道如何突出显示 TextBox Label 最好 或 RichTextBox 中包含的部分文本 例如 给定字符串 这是一个测试 我希望控件显示 这是一个test 有什么简单的方法可以做到吗 非常感谢 RichTextBox r
  • NodeJs 错误 - 无法加载 gRPC 二进制模块,因为未为当前系统安装预期目录?

    我正在运行我的 NodeJs 应用程序 但收到错误 sudo usr local bin node app js Error Failed to load gRPC binary module because it was not inst
  • 使用 JavaScript 的 URL 的最后一段

    如何获取 url 的最后一段 我有以下脚本 显示单击的锚标记的完整 url tag name goes here live click function event event preventDefault alert this attr
  • 隐藏单选按钮,同时保留其功能

    我在 SO 和 Google 上搜索 但找不到任何相关内容 有什么方法可以隐藏图像旁边的单选按钮 用作其标签 但在单击标签时仍然保留其功能 我尝试了几种方法 但似乎使用display none or visibility hidden使收音
  • Android SurfaceView 预览模糊

    我有一个快速的问题 我正在使用 Android 的 SurfaceView 拍照并保存 然而 预览尺寸和图像质量本身都很糟糕 就像 它非常模糊 图像质量根本没有清晰度 这是我初始化 SurfaceView 的地方 camera setDis
  • 如何以不同的速度流畅播放FLV?

    我需要以不同的速率显示 FLV 的帧 这里有些例子 用户将 擦洗 flv 帧 前 后 flv 在用户交互时需要以一半的速度播放 目前我正在使用装载机最大 http www greensock com loadermax 它是VideoLoa
  • onFlushDirty Hibernate Interceptor 方法永远不会被调用

    问题 Why MyInterceptor onFlushDirty从未被调用过 我延长AbstractEntityManagerFactoryBean在 xml 配置中 例如
  • 如何正确扩展ES6 Map

    我有一个简单的案例 ES6Map 我需要添加自定义get and set to it But Map是一个内置对象 所以我不确定这样做是否有任何警告 我试图搜索子类化 a 是否正确Map 并得到不一致的结果 尚不清楚规范是否允许 哪些 br
  • Jquery next() 问题

    我有这个 div class selection a class current href 1 a div class class text div a href 2 a div class class text div a href 4
  • sudo 使用什么 shell

    我很抱歉 因为这一定是其他人问过的问题 但这似乎是谷歌证明 我试图弄清楚正在调用什么 shell 因为我遇到了不一致的情况 如果我这样做 我的脚本将无法工作sudo 但是如果我的话确实有效sudo bash 然而当我sudo echo 0
  • 使用各种方法无法使系统蜂鸣声在 C 中工作

    我已经尝试过 a 7 windows h 蜂鸣功能等 但没有任何效果 较新的硬件没有内置此功能吗 控制台程序 较新的硬件需要为残障人士提供蜂鸣声 但 Windows 7 移动了Beep 进入实际的 Windows 音频子系统 因此请确保您的
  • 测试两个列表列表是否相等

    假设我在 Python 中有两个列表 l1 a 1 b 2 c 3 l2 b 2 c 3 a 1 测试它们是否相等的最优雅的方法是什么 l1只是元素的一些排列l2 注意对普通列表执行此操作see here https stackoverfl
  • 在采用多个可选参数的方法中,如何指定除第一个参数之外的任何参数?

    我有一个这样的方法 def foo fruit apple cut sliced topping ice cream some logic here end 我怎样才能调用它 我只覆盖顶部参数 但使用其他参数的默认值 像这样 foo hot
  • 导入使用 MultiProcessing Python 的模块

    我希望使用多处理模块来加快某些运输规划模型的运行时间 我已经通过 正常 方法尽可能多地进行了优化 但其核心是一个荒谬的并行问题 例如 对 4 组不同的输入执行同一组矩阵运算 所有信息都是独立的 伪代码 for mat1 mat2 mat3
  • 在 Java Servlet 中生成 HTML 响应

    如何在 Java servlet 中生成 HTML 响应 通常 您会将请求转发到 JSP 进行显示 JSP 是一种视图技术 它提供了一个用于编写普通 HTML CSS JS 的模板 并提供了借助标签库和 EL 与后端 Java 代码 变量进
  • 折线百分比的纬度

    如何沿折线返回给定百分比的 latLng 值 我花了一天时间使用插值和单个节点来完成此任务 他们是不是有一个更简单的函数可以让 grunt 工作 谷歌地图 API v3 谢谢 http www geocodezip com scripts
  • 是否可以在 java jit 上使用 Final boolean 删除跳转?

    正如我们所知 有些人说 java JIT 比 C 更快 我有一些想法 可以利用 JIT 并在运行时代码中删除一些指令 这是我尝试过的示例代码 Created by kadirbasol on 4 6 14 public class Remo