返回顶部
首页 > 资讯 > 精选 >Java求余%操作的示例分析
  • 622
分享到

Java求余%操作的示例分析

2023-06-15 06:06:15 622人浏览 泡泡鱼
摘要

这篇文章主要介绍了Java求余%操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。操作符%通常用在正整数上,但同样可以用在负整数和浮点数上。  注意:只有当被除数是

这篇文章主要介绍了Java求余%操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

操作符%通常用在正整数上,但同样可以用在负整数和浮点数上。
  注意:只有当被除数是负数时, 余数才是负的。

C1 RCE对%的处理

HotSpot VM的C1有个RCE(Range Check Elimination,范围检查消除)优化,所谓范围检查消除,就是为了正确的抛出数组越界异常,虚拟机需要在数组访问的一些地方插入隐式的检查,但是这些检查会降低性能,比如在循环中每次循环都得检查一次,所以HotSpot VM会想办法在可能的地方消除这些检查。我在看C1 RCE的时候发现目前它对求余符号的支持较为薄弱,它只能处理形如下面的代码:

arr[x%arr.length] // 只有除数是x.length的时候,才能应用RCE优化

如果余数是整数常量,它就不能工作了:

arr[x%3]for(int i=0;i<10;i++){  arr[x%10]}

实际上,根据JLS的定义,我们知道如果除数为整数常量(且等于零,因为0作为除数会抛出运行时异常),是可以推导出结果的上下界的(也取决于被除数的正负),规则如下:

  • x % -y ==> [0, y - 1]

  • x % y ==> [0, y - 1]

  • -x % y ==> [-y + 1, 0]

  • -x % -y ==> [-y + 1, 0]

于是,我给jdk发了个patch,这个问题算是解决了。但是Nils提到,C2是否有相同的优化呢?后面Tobias帮忙确认了一下C2没有,我再后来也进一步确认了,所以下一步是调研C2是否能应用同样的优化。

调研为C2应用同样的优化

本来以为是比较trivial的事情,为求余节点的类型系统加点代码,推导一下上下界即可,实际上我也这么做的,但是最后发现这样没有消除上下界。默认开启-XX:+GenerateRangeChecks后,在数组访问过程中(Parse::array_addressing),C2仍然生成了范围检查。

调试后发现推导上下界根本没有执行,因为C2创建完求余节点后,会执行一个IGVN的过程,即迭代的应用多种优化,其中就包括理想化,C2理想化是指应用很多局部小优化的过程,在这个例子中就是特殊处理形如x%2^n,x%2^n-1x%1的情况,如果除数是整数常量,它还会使用一个来自https://book.douban.com/subject/1784887/书里面的算法,即Division by Invariant Integers using Multiplication(by Granlund and MontGomery),搜了一下知乎有类似的文章,想要了解细节可以读读Https://zhuanlan.zhihu.com/p/151038723。知道了原因,于是我改了下代码,禁止了求余节点的理想化,心想这总可以了吧。

还是不行

是的,还是不行。尽管我已经禁止了对求余符号的理想化优化,但是范围检查还是生成了。。。我又继续看代码,发现除了理想化的这个优化之外,C2在IR(中间表示)构造的过程中又 又 又 又 又对求余运算做了个优化!如果除数是正整数常量,且是2^n,那么C2会对它进行变形,IR如图所示:

Java求余%操作的示例分析

左边的IR是 IR构造的时候C2做的优化后的效果,右边是理想化优化后的效果。实际上它们做的事情本身是比较重复的,而且经过测试发现,理想化优化的算法要好于IR构造过程中的优化,所以我又提了个patch解决这个问题(不过还在review中)。

感谢你能够认真阅读完这篇文章,希望小编分享的“Java求余%操作的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java求余%操作的示例分析

本文链接: https://lsjlt.com/news/278468.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java求余%操作的示例分析
    这篇文章主要介绍了Java求余%操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。操作符%通常用在正整数上,但同样可以用在负整数和浮点数上。  注意:只有当被除数是...
    99+
    2023-06-15
  • java操作mongoDB查询的示例分析
    小编给大家分享一下java操作mongoDB查询的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java操作mongo查...
    99+
    2024-04-02
  • Java字符串操作的示例分析
    这篇文章主要介绍了Java字符串操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。✨字符, 字节与字符串字符与字符串字符串内部包含一个字符数组,String 可以和...
    99+
    2023-06-25
  • java的Stream API终端操作示例分析
    这篇文章主要介绍“java的Stream API终端操作示例分析”,在日常操作中,相信很多人在java的Stream API终端操作示例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”j...
    99+
    2023-06-29
  • jQuery操作DOM的示例分析
    这篇文章主要介绍jQuery操作DOM的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jQuery的选择器很强大,用起来又简单又灵活,但是搞了这么久,我拿到了jQuery对象...
    99+
    2024-04-02
  • jquery操作ul的示例分析
    这篇文章给大家分享的是有关jquery操作ul的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、html标记 <ul id="att...
    99+
    2024-04-02
  • C++操作符的示例分析
    这篇文章给大家介绍C++操作符的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++操作符是C++中的一个高级C++技术,下面进行相关介绍,或许你发现,有些操作符使用了相同的符号,符号的意义可以随环境进行改变,...
    99+
    2023-06-17
  • Hibernate update操作的示例分析
    这篇文章主要介绍Hibernate update操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在所有之前,说明一下,对于Hibernate,它的对象有三种状态,transient、persistent、...
    99+
    2023-06-17
  • js cookie操作的示例分析
    这篇文章主要介绍了js cookie操作的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。cookieObj=function(){}cookieObj.prototy...
    99+
    2023-06-03
  • java中volatile变量并发操作的示例分析
    小编给大家分享一下java中volatile变量并发操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java的特点有哪些Java的特点有哪些1.Jav...
    99+
    2023-06-14
  • Java操作符与其优先级的示例分析
    这篇文章给大家分享的是有关Java操作符与其优先级的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。几乎所有运算符都只能操作“主类型”(Primitives)。例外是“=”、“= =”和“! =”,它们能操...
    99+
    2023-05-30
    java
  • Java求余%操作引发的一连串故事
    操作符%通常用在正整数上,但同样可以用在负整数和浮点数上。   注意:只有当被除数是负数时, 余数才是负的。 C1 RCE对%的处理 HotSpot VM的C1有个RCE(Range...
    99+
    2024-04-02
  • Mysql中join操作的示例分析
    小编给大家分享一下Mysql中join操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!join的类型1.  ...
    99+
    2024-04-02
  • SQL中DDL操作的示例分析
    这篇文章给大家分享的是有关SQL中DDL操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 1、数据库对象    表&...
    99+
    2024-04-02
  • mysql权限操作的示例分析
    这篇文章给大家分享的是有关mysql权限操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 1、创建新用户: create user mark@localhost ...
    99+
    2024-04-02
  • Angular4.0动画操作的示例分析
    这篇文章主要为大家展示了“Angular4.0动画操作的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular4.0动画操作的示例分析”这篇文章吧...
    99+
    2024-04-02
  • JavaScript操作表单的示例分析
    这篇文章主要为大家展示了“JavaScript操作表单的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript操作表单的示例分析”这篇文章吧...
    99+
    2024-04-02
  • JavaScript中DOM操作的示例分析
    这篇文章主要介绍JavaScript中DOM操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:一、DOM概念1. "D":Docment,指的...
    99+
    2024-04-02
  • Linux操作系统的示例分析
    这篇文章给大家分享的是有关Linux操作系统的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、Linux简介Linux可以有狭义和广义两种定义。狭义来说,Linux实际上指Linux kernel (内...
    99+
    2023-06-13
  • Python中opencv操作的示例分析
    这篇文章主要介绍Python中opencv操作的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!直接读取图片def display_img(file="p.jpeg"): ...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作