RFR[10]: 8180614: Skip range and constraint checks on non-existent flags

Claes Redestad claes.redestad at oracle.com
Fri May 19 14:44:53 UTC 2017


Hi Ioi,

On 2017-05-19 16:26, Ioi Lam wrote:
> Hi Claes,
>
> The new webrev looks good. Thanks!

Thanks!

For reference this gets down the cost of checking constraints and ranges 
from ~3.5M instructions (~1ms) to less than 200k (<0.1ms).

/Claes

>
> - Ioi
>
> On 5/19/17 4:40 AM, Claes Redestad wrote:
>> Hi Ioi,
>>
>> On 05/18/2017 07:42 PM, Ioi Lam wrote:
>>> Hi Claes,
>>>
>>>
>>> This looks good to me.
>>
>> thanks!
>>
>>>
>>> As a further optimization, I wonder if we can get rid of all the calls
>>>
>>> CommandLineFlagRangeList::check_ranges() -> Flag::find_flag()
>>
>> Yes, I was considering approaches to improve this even further as a 
>> follow up, but it turns out it was easier than I had envisioned with 
>> some helpful pointers... ;-)
>>
>>>
>>> Now, we will do more range checks than before, including flags that 
>>> won't be returned by Flag::find_flag, like these guys:
>>>
>>> Flag* Flag::find_flag(const char* name, size_t length, bool 
>>> allow_locked, bool return_flag) {
>>>   for (Flag* current = &flagTable[0]; current->_name != NULL; 
>>> current++) {
>>>     if (str_equal(current->_name, current->get_name_length(), name, 
>>> length)) {
>>>       ...
>>>       if (!(current->is_unlocked() || current->is_unlocker())) {
>>>         if (!allow_locked) {
>>>           // disable use of locked flags, e.g. diagnostic, 
>>> experimental,
>>>           // commercial... until they are explicitly unlocked
>>> HERE>>>>  return NULL;
>>>
>>>
>>> But I think this is better, as we can even find errors in the ergo 
>>> code that might have programmatically modified a diagnostic flag, 
>>> for example.
>>
>> Yes, this definitely seems like an improvement.
>>
>> Updated webrev: http://cr.openjdk.java.net/~redestad/8180614/hotspot.01/
>>
>> We discussed offline if all the constraint and range classes could be 
>> turned into templates, and while it superficially seems easy there 
>> are some uses of constraint methods from globals.cpp that needs 
>> special care, so I decided to defer that cleanup.
>>
>>
>>>
>>> Or, we can even go one step further, add the ranges into the 
>>> Flag::flags table directly. Then, we just need to walk this table 
>>> sequentially. We can get rid of all the malloc inside 
>>> CommandLineFlagRangeList::init() <-- how many cycles are spent here?
>>>
>>> => try building commandLineFlagRangeList.o with --save-temps and 
>>> look at the file commandLineFlagRangeList.ii :-)
>>>
>>>
>>> And, we can sort Flag::flags alphabetically (by generating this 
>>> table using a C program, which includes globals.hpp, during build 
>>> time). That way Flag::find_flag can be searched on O(log n) time.
>>>
>>> What do you think?
>>
>> Might be a lot of effort for no measurable startup gain (since the 
>> above solution gets rid of calls to most calls to find_flag), and 
>> other uses of find_flag doesn't seem very performance critical.
>>
>> Cleaning up the magic numbers in commandLineFlag*List.cpp would be 
>> nice, though...
>>
>> Thanks!
>>
>> /Claes
>>
>>>
>>>
>>> Thanks
>>> - Ioi
>>>
>>>
>>> On 5/18/17 9:35 AM, Claes Redestad wrote:
>>>> Hi,
>>>>
>>>> analyzing the remaining overhead in command line flag
>>>> checking after JDK-8178991, I found that we're taking a
>>>> runtime cost scanning for flags that doesn't exist in the
>>>> build, e.g., develop flags in a product build.
>>>>
>>>> Since such flags are simply emitted as constants, they
>>>> can't[1] be in violation of the constraints, thus I think
>>>> we can safely skip such checks altogether.
>>>>
>>>> This removes ~500k instructions from being executed for
>>>> no reason during VM startup on a 64-bit JVM.
>>>>
>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8180614
>>>> Webrev: http://cr.openjdk.java.net/~redestad/8180614/hotspot.00/
>>>>
>>>> Thanks!
>>>>
>>>> /Claes
>>>>
>>>> [1] Unless the default value is invalid, which is a potential
>>>> programmer error that would be caught in debug builds
>>>> anyhow.
>>>
>>
>



More information about the hotspot-runtime-dev mailing list