亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java求余%操作的示例分析

發布時間:2021-05-31 10:40:25 來源:億速云 閱讀:118 作者:小新 欄目:開發技術

這篇文章主要介紹了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求余%操作的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

塔河县| 阜南县| 卢湾区| 永仁县| 汤原县| 东乌珠穆沁旗| 武功县| 博罗县| 江口县| 拜泉县| 石河子市| 永昌县| 盐亭县| 滨州市| 阿瓦提县| 普定县| 锡林郭勒盟| 察隅县| 塔河县| 绵阳市| 正宁县| 柳河县| 会昌县| 洛宁县| 东莞市| 吴川市| 兴宁市| 大渡口区| 奉节县| 新安县| 即墨市| 上饶县| 塔河县| 石景山区| 涿鹿县| 龙里县| 余干县| 乐清市| 华亭县| 会同县| 明水县|