Created
February 21, 2014 07:05
-
-
Save eropple/9130015 to your computer and use it in GitHub Desktop.
WAT
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* All recent hotspots (as of 2009) *really* like to have the natural code | |
* | |
* if (guardExpression) { | |
* throw new BadException(messageExpression); | |
* } | |
* | |
* refactored so that messageExpression is moved to a separate | |
* String-returning method. | |
* | |
* if (guardExpression) { | |
* throw new BadException(badMsg(...)); | |
* } | |
* | |
* The alternative natural refactorings into void or Exception-returning | |
* methods are much slower. This is a big deal - we're talking factors of | |
* 2-8 in microbenchmarks, not just 10-20%. (This is a hotspot optimizer | |
* bug, which should be fixed, but that's a separate, big project). | |
* | |
* The coding pattern above is heavily used in java.util, e.g. in ArrayList. | |
* There is a RangeCheckMicroBenchmark in the JDK that was used to test this. | |
* | |
* But the methods in this class want to throw different exceptions, | |
* depending on the args, so it appears that this pattern is not directly | |
* applicable. But we can use the ridiculous, devious trick of throwing an | |
* exception in the middle of the construction of another exception. | |
* Hotspot is fine with that. | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment