Optimizations of When expression with int constants: heuristics from openJDK for decision about using tableswitch/lookupswitch
This commit is contained in:
committed by
Evgeny Gerashchenko
parent
a83d600f5e
commit
298742ae69
@@ -3820,12 +3820,22 @@ The "returned" value of try expression with no finally is either the last expres
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hi = keys[keys.length - 1];
|
int nlabels = keys.length;
|
||||||
|
int hi = keys[nlabels - 1];
|
||||||
int lo = keys[0];
|
int lo = keys[0];
|
||||||
long emptyCells = ((long) hi - (long) lo + 1) - keys.length;
|
|
||||||
|
|
||||||
boolean useTableSwitch = keys.length > 0 &&
|
/*
|
||||||
10L * emptyCells <= (long) keys.length; // less then 10% of empty cells
|
* Heuristic estimation if it's better to use tableswitch or lookupswitch.
|
||||||
|
* From OpenJDK sources
|
||||||
|
*/
|
||||||
|
long table_space_cost = 4 + ((long) hi - lo + 1); // words
|
||||||
|
long table_time_cost = 3; // comparisons
|
||||||
|
long lookup_space_cost = 3 + 2 * (long) nlabels;
|
||||||
|
long lookup_time_cost = nlabels;
|
||||||
|
|
||||||
|
boolean useTableSwitch = nlabels > 0 &&
|
||||||
|
table_space_cost + 3 * table_time_cost <=
|
||||||
|
lookup_space_cost + 3 * lookup_time_cost;
|
||||||
|
|
||||||
if (!useTableSwitch) {
|
if (!useTableSwitch) {
|
||||||
v.lookupswitch(defaultLabel, keys, labels);
|
v.lookupswitch(defaultLabel, keys, labels);
|
||||||
|
|||||||
Reference in New Issue
Block a user