On Wed, 12 Jun 2024 08:16:25 GMT, Jaikiran Pai <j...@openjdk.org> wrote:
>> Chris Hennick has updated the pull request incrementally with one additional >> commit since the last revision: >> >> Bug fix: add-exports was for wrong package > > src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java line > 1214: > >> 1212: // We didn't use the upper part of U1 after all. We'll >> probably be able to use it later. >> 1213: if (maxValue <= DoubleZigguratTables.exponentialX0) { >> 1214: return DoubleZigguratTables.exponentialX0; > > Chris, could you explain why this change to this if block is necessary? Guy > notes that (I've paraphrased): > >> I can see that (without this proposed change here), if `maxValue` is not >> greater than `DoubleZigguratTables.exponentialX0`, then the subsequent >> computation for `maxExtraMinus1`, a few lines below using `Math.round()`, >> will compute 1 or 2 for the value of `maxExtraMinus1`. But with this >> proposed change, it just returns `DoubleZigguratTables.exponentialX0`, which >> by the contract of `computeNextExponentialSoftCapped` is okay (the doc says >> "{@code maxValue} is a "soft" cap in that a value larger than {@code >> maxValue} may be returned in order to save a calculation" and I remember >> that that is true). So that is also okay. The motivation for doing so would >> be that it saves computation time overall. The part I don't quite understand >> yet is the judgment that it will in fact save computation time overall. If >> you take advantage of the "soft cap" then it could cause additional >> iteration of the loop in `computeNextGaussian` where this >> `computeNextExponentialSoftCapped` method gets called. I'm uncertain whether the change to this if block is guaranteed or likely to save computation time. Updated to return `maxValue` instead. Now it's unambiguously a performance optimization. > src/java.base/share/classes/jdk/internal/util/random/RandomSupport.java line > 1222: > >> 1220: // Math.round rounds toward infinity in conversion to >> long; adding 1.0 corrects for any >> 1221: // downward rounding error in the division >> 1222: maxExtraMinus1 = Math.round(1.0 + maxValue / >> DoubleZigguratTables.exponentialX0); > > We had asked Guy Steele for his inputs on these proposed changes. Guy > reviewed these changes and for this specific if/else block change, he notes > that (I've paraphrased it): > >> the (proposed new) computation of `maxExtraMinus1` looks okay to me: it’s >> always okay for maxExtraMinus1 to be a bit larger than you might expect; the >> only downside is that the (for) loop starting (on the next line) might take >> extra iterations. Is Guy saying it's impossible for `maxExtraMinus1` to be too small even without this change? ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/17703#discussion_r1712306048 PR Review Comment: https://git.openjdk.org/jdk/pull/17703#discussion_r1712308075