最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java求余%操作引發(fā)的一連串故事

 更新時間:2021年05月28日 11:54:02   作者:kelthuzadx  
取模運算與取余運算兩個概念有重疊的部分但又不完全一致。主要的區(qū)別在于對負(fù)整數(shù)進(jìn)行除法運算時操作不同。本文重點給大家介紹Java求余%操作引發(fā)的一連串故事,感興趣的朋友跟隨小編一起看看吧

操作符%通常用在正整數(shù)上,但同樣可以用在負(fù)整數(shù)和浮點數(shù)上。
  注意:只有當(dāng)被除數(shù)是負(fù)數(shù)時, 余數(shù)才是負(fù)的。

C1 RCE對%的處理

HotSpot VM的C1有個RCE(Range Check Elimination,范圍檢查消除)優(yōu)化,所謂范圍檢查消除,就是為了正確的拋出數(shù)組越界異常,虛擬機(jī)需要在數(shù)組訪問的一些地方插入隱式的檢查,但是這些檢查會降低性能,比如在循環(huán)中每次循環(huán)都得檢查一次,所以HotSpot VM會想辦法在可能的地方消除這些檢查。我在看C1 RCE的時候發(fā)現(xiàn)目前它對求余符號的支持較為薄弱,它只能處理形如下面的代碼:

arr[x%arr.length] // 只有除數(shù)是x.length的時候,才能應(yīng)用RCE優(yōu)化

如果余數(shù)是整數(shù)常量,它就不能工作了:

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

實際上,根據(jù)JLS的定義,我們知道如果除數(shù)為整數(shù)常量(且等于零,因為0作為除數(shù)會拋出運行時異常),是可以推導(dǎo)出結(jié)果的上下界的(也取決于被除數(shù)的正負(fù)),規(guī)則如下:

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

于是,我給JDK發(fā)了個patch,這個問題算是解決了。但是Nils提到,C2是否有相同的優(yōu)化呢?后面Tobias幫忙確認(rèn)了一下C2沒有,我再后來也進(jìn)一步確認(rèn)了,所以下一步是調(diào)研C2是否能應(yīng)用同樣的優(yōu)化。

調(diào)研為C2應(yīng)用同樣的優(yōu)化

本來以為是比較trivial的事情,為求余節(jié)點的類型系統(tǒng)加點代碼,推導(dǎo)一下上下界即可,實際上我也這么做的,但是最后發(fā)現(xiàn)這樣沒有消除上下界。默認(rèn)開啟-XX:+GenerateRangeChecks后,在數(shù)組訪問過程中(Parse::array_addressing),C2仍然生成了范圍檢查。

調(diào)試后發(fā)現(xiàn)推導(dǎo)上下界根本沒有執(zhí)行,因為C2創(chuàng)建完求余節(jié)點后,會執(zhí)行一個IGVN的過程,即迭代的應(yīng)用多種優(yōu)化,其中就包括理想化,C2理想化是指應(yīng)用很多局部小優(yōu)化的過程,在這個例子中就是特殊處理形如x%2^n,x%2^n-1x%1的情況,如果除數(shù)是整數(shù)常量,它還會使用一個來自https://book.douban.com/subject/1784887/書里面的算法,即Division by Invariant Integers using Multiplication(by Granlund and Montgomery),搜了一下知乎有類似的文章,想要了解細(xì)節(jié)可以讀讀https://zhuanlan.zhihu.com/p/151038723。知道了原因,于是我改了下代碼,禁止了求余節(jié)點的理想化,心想這總可以了吧。

還是不行

是的,還是不行。盡管我已經(jīng)禁止了對求余符號的理想化優(yōu)化,但是范圍檢查還是生成了。。。我又繼續(xù)看代碼,發(fā)現(xiàn)除了理想化的這個優(yōu)化之外,C2在IR(中間表示)構(gòu)造的過程中又 又 又 又 又對求余運算做了個優(yōu)化!如果除數(shù)是正整數(shù)常量,且是2^n,那么C2會對它進(jìn)行變形,IR如圖所示:

左邊的IR是 IR構(gòu)造的時候C2做的優(yōu)化后的效果,右邊是理想化優(yōu)化后的效果。實際上它們做的事情本身是比較重復(fù)的,而且經(jīng)過測試發(fā)現(xiàn),理想化優(yōu)化的算法要好于IR構(gòu)造過程中的優(yōu)化,所以我又提了個patch解決這個問題(不過還在review中)。

結(jié)語

我認(rèn)為為求余節(jié)點推導(dǎo)上下界也是有意義的,如果以后有其他優(yōu)化會變形為求余運算,那么它們可以應(yīng)用這個推導(dǎo),同時,為求余做統(tǒng)一完善的類型推導(dǎo)這件事本身也是正確的,所以我又提了個patch??梢钥吹?,最終我只消除了C1 arr[x%4]的范圍檢查,還是沒能消除C2 arr[x%4]的范圍檢查,是不是以后可以說C1有的地方做的比C2好了(狗頭hh。

以上就是Java求余%操作引發(fā)的一連串故事的詳細(xì)內(nèi)容,更多關(guān)于Java求余%的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot+layui實現(xiàn)文件上傳功能

    SpringBoot+layui實現(xiàn)文件上傳功能

    Spring Boot是由Pivotal團(tuán)隊提供的全新框架,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程。這篇文章主要介紹了SpringBoot+layui實現(xiàn)文件上傳,需要的朋友可以參考下
    2018-09-09
  • Java泛型繼承原理與用法詳解

    Java泛型繼承原理與用法詳解

    這篇文章主要介紹了Java泛型繼承原理與用法,結(jié)合實例形式分析了java泛型繼承的相關(guān)原理與實現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • 解析springboot整合谷歌開源緩存框架Guava Cache原理

    解析springboot整合谷歌開源緩存框架Guava Cache原理

    本文主要為大家解析了springboot整合谷歌開源緩存框架Guava Cache的原理以及在實際開發(fā)過程中的使用,附含源碼,有需要的朋友可以參考下
    2021-08-08
  • Dependency ‘XXX:‘ not found問題的三步解決

    Dependency ‘XXX:‘ not found問題的三步解決

    這篇文章主要介紹了Dependency ‘XXX:‘ not found問題的三步解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • SpringMVC獲取請求參數(shù)筆記整理

    SpringMVC獲取請求參數(shù)筆記整理

    本文記錄和分享在學(xué)習(xí)Spring MVC過程中的筆記,通過案例示例代碼分析給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • spring boot validation參數(shù)校驗實例分析

    spring boot validation參數(shù)校驗實例分析

    這篇文章主要介紹了spring boot validation參數(shù)校驗,結(jié)合實例形式分析了spring boot validation進(jìn)行數(shù)據(jù)有效性驗證的相關(guān)操作技巧,需要的朋友可以參考下
    2019-11-11
  • Invalid bound statement(not found):錯誤的解決方案

    Invalid bound statement(not found):錯誤的解決方案

    本文介紹了在開發(fā)Java SpringBoot應(yīng)用程序時出現(xiàn)的"Invalidboundstatement(notfound)"錯誤的原因及解決方法,該錯誤通常與MyBatis或其他持久化框架相關(guān),可能是由于配置錯誤、拼寫錯誤或其他問題引起的,解決方法包括檢查SQL映射文件
    2025-01-01
  • Springboot創(chuàng)建子父工程過程圖解

    Springboot創(chuàng)建子父工程過程圖解

    這篇文章主要介紹了Springboot創(chuàng)建子父工程過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Java中json使用方法_動力節(jié)點Java學(xué)院整理

    Java中json使用方法_動力節(jié)點Java學(xué)院整理

    JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式, json是個非常重要的數(shù)據(jù)結(jié)構(gòu),在web開發(fā)中應(yīng)用十分廣泛。下面通過本文給大家講解Java中json使用方法,感興趣的朋友一起看看吧
    2017-07-07
  • Java?Web開發(fā)中的分頁與參數(shù)校驗舉例詳解

    Java?Web開發(fā)中的分頁與參數(shù)校驗舉例詳解

    這篇文章主要介紹了JavaWeb開發(fā)中的分頁設(shè)計和參數(shù)校驗,分頁設(shè)計通過分頁查詢參數(shù)優(yōu)化查詢性能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02

最新評論

阜新市| 奉节县| 垫江县| 衡阳市| 临颍县| 宿州市| 莎车县| 华安县| 藁城市| 罗甸县| 秦皇岛市| 临沧市| 江源县| 清流县| 彰化市| 九江市| 城固县| 全南县| 昭平县| 天祝| 包头市| 铁岭市| 乌兰浩特市| 旬阳县| 五原县| 柏乡县| 吐鲁番市| 衡山县| 卢氏县| 甘泉县| 沙湾县| 安远县| 兰考县| 纳雍县| 乐东| 东丰县| 二手房| 额敏县| 泽库县| 亚东县| 建始县|