Details
-
Enhancement
-
Resolution: Unresolved
-
P4
-
17
-
generic
-
generic
Description
ADDITIONAL SYSTEM INFORMATION :
testet JDK11, JDK15, JDK17, Windows 10 x86 64Bit.
A DESCRIPTION OF THE PROBLEM :
Java switch-case statements are compiled to lookupswitch or tableswitch java bytecode. It is expected that for n cases the performance is O(1) for tableswitch and at least O(log(n)) for lookupswitch (see https://stackoverflow.com/questions/10287700/difference-between-jvms-lookupswitch-and-tableswitch). The truth is both are equaly good (C2 level 4) or bad (C2 level 3): For TieredStopAtLevel=3 the switch performance is O(n) :-(.
The problem is that for very big n the code will never reach level 4 but is still slow/hotspot. (real world use case is a java compiler with ~1000 cases per switch - see https://bugs.eclipse.org/bugs/show_bug.cgi?id=574361 )
A possible improvement may be to trigger level 4 after fewer runs for switches with many cases. To get a real O(1) the number of runs needed to get to level 4 would be antiproportional to the number of switch cases. i.e. each case statement should count as a normal run even if the case is not taken.
jmh benchmark to proof O(n) behaviour on level 3:
package benchmarks;
import java.io.IOException;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
@BenchmarkMode(org.openjdk.jmh.annotations.Mode.AverageTime)
@OutputTimeUnit(java.util.concurrent.TimeUnit.NANOSECONDS)
@State(org.openjdk.jmh.annotations.Scope.Thread)
@Warmup(time = 2000, timeUnit = java.util.concurrent.TimeUnit.NANOSECONDS, iterations = 200)
@Measurement(time = 2000, timeUnit = java.util.concurrent.TimeUnit.NANOSECONDS, iterations = 200)
public class Switch {
int my_int;
@Setup
public void setup() {
my_int = 255;
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int branch3() throws IOException {
return branch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int branch4() throws IOException {
return branch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int halfSwitch3() throws IOException {
return halfSwitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int halfSwitch4() throws IOException {
return halfSwitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int lookupswitch3() throws IOException {
return lookupswitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int lookupswitch4() throws IOException {
return lookupswitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int tableswitch3() throws IOException {
return tableswitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int tableswitch4() throws IOException {
return tableswitch();
}
public int branch() throws IOException {
if (my_int == 1) {
return 99999;
}
return 0;
}
public int lookupswitch() throws IOException {
switch (my_int) {
case 1:
return 99999;
case 2:
return 99998;
case 3:
return 99997;
case 4:
return 99996;
case 5:
return 99995;
case 6:
return 99994;
case 7:
return 99993;
case 8:
return 99992;
case 9:
return 99991;
case 10:
return 99990;
case 11:
return 99989;
case 12:
return 99988;
case 13:
return 99987;
case 14:
return 99986;
case 15:
return 99985;
case 16:
return 99984;
case 17:
return 99983;
case 18:
return 99982;
case 19:
return 99981;
case 20:
return 99980;
case 21:
return 99979;
case 22:
return 99978;
case 23:
return 99977;
case 24:
return 99976;
case 25:
return 99975;
case 26:
return 99974;
case 27:
return 99973;
case 28:
return 99972;
case 29:
return 99971;
case 30:
return 99970;
case 31:
return 99969;
case 32:
return 99968;
case 33:
return 99967;
case 34:
return 99966;
case 35:
return 99965;
case 36:
return 99964;
case 37:
return 99963;
case 38:
return 99962;
case 39:
return 99961;
case 40:
return 99960;
case 41:
return 99959;
case 42:
return 99958;
case 43:
return 99957;
case 44:
return 99956;
case 45:
return 99955;
case 46:
return 99954;
case 47:
return 99953;
case 48:
return 99952;
case 49:
return 99951;
case 50:
return 99950;
case 51:
return 99949;
case 52:
return 99948;
case 53:
return 99947;
case 54:
return 99946;
case 55:
return 99945;
case 56:
return 99944;
case 57:
return 99943;
case 58:
return 99942;
case 59:
return 99941;
case 60:
return 99940;
case 61:
return 99939;
case 62:
return 99938;
case 63:
return 99937;
case 64:
return 99936;
case 65:
return 99935;
case 66:
return 99934;
case 67:
return 99933;
case 68:
return 99932;
case 69:
return 99931;
case 70:
return 99930;
case 71:
return 99929;
case 72:
return 99928;
case 73:
return 99927;
case 74:
return 99926;
case 75:
return 99925;
case 76:
return 99924;
case 77:
return 99923;
case 78:
return 99922;
case 79:
return 99921;
case 80:
return 99920;
case 81:
return 99919;
case 82:
return 99918;
case 83:
return 99917;
case 84:
return 99916;
case 85:
return 99915;
case 86:
return 99914;
case 87:
return 99913;
case 88:
return 99912;
case 89:
return 99911;
case 90:
return 99910;
case 91:
return 99909;
case 92:
return 99908;
case 93:
return 99907;
case 94:
return 99906;
case 95:
return 99905;
case 96:
return 99904;
case 97:
return 99903;
case 98:
return 99902;
case 99:
return 99901;
case 100:
return 99900;
case 101:
return 99899;
case 102:
return 99898;
case 103:
return 99897;
case 104:
return 99896;
case 105:
return 99895;
case 106:
return 99894;
case 107:
return 99893;
case 108:
return 99892;
case 109:
return 99891;
case 110:
return 99890;
case 111:
return 99889;
case 112:
return 99888;
case 113:
return 99887;
case 114:
return 99886;
case 115:
return 99885;
case 116:
return 99884;
case 117:
return 99883;
case 118:
return 99882;
case 119:
return 99881;
case 120:
return 99880;
case 121:
return 99879;
case 122:
return 99878;
case 123:
return 99877;
case 124:
return 99876;
case 125:
return 99875;
case 126:
return 99874;
case 127:
return 99873;
case 128:
return 99872;
case 129:
return 99871;
case 130:
return 99870;
case 131:
return 99869;
case 132:
return 99868;
case 133:
return 99867;
case 134:
return 99866;
case 135:
return 99865;
case 136:
return 99864;
case 137:
return 99863;
case 138:
return 99862;
case 139:
return 99861;
case 140:
return 99860;
case 141:
return 99859;
case 142:
return 99858;
case 143:
return 99857;
case 144:
return 99856;
case 145:
return 99855;
case 146:
return 99854;
case 147:
return 99853;
case 148:
return 99852;
case 149:
return 99851;
case 150:
return 99850;
case 151:
return 99849;
case 152:
return 99848;
case 153:
return 99847;
case 154:
return 99846;
case 155:
return 99845;
case 156:
return 99844;
case 157:
return 99843;
case 158:
return 99842;
case 159:
return 99841;
case 160:
return 99840;
case 161:
return 99839;
case 162:
return 99838;
case 163:
return 99837;
case 164:
return 99836;
case 165:
return 99835;
case 166:
return 99834;
case 167:
return 99833;
case 168:
return 99832;
case 169:
return 99831;
case 170:
return 99830;
case 171:
return 99829;
case 172:
return 99828;
case 173:
return 99827;
case 174:
return 99826;
case 175:
return 99825;
case 176:
return 99824;
case 177:
return 99823;
case 178:
return 99822;
case 179:
return 99821;
case 180:
return 99820;
case 181:
return 99819;
case 182:
return 99818;
case 183:
return 99817;
case 184:
return 99816;
case 185:
return 99815;
case 186:
return 99814;
case 187:
return 99813;
case 188:
return 99812;
case 189:
return 99811;
case 190:
return 99810;
case 191:
return 99809;
case 192:
return 99808;
case 193:
return 99807;
case 194:
return 99806;
case 195:
return 99805;
case 196:
return 99804;
case 197:
return 99803;
case 198:
return 99802;
case 199:
return 99801;
case 200:
return 99800;
case 201:
return 99799;
case 202:
return 99798;
case 203:
return 99797;
case 204:
return 99796;
case 205:
return 99795;
case 206:
return 99794;
case 207:
return 99793;
case 208:
return 99792;
case 209:
return 99791;
case 210:
return 99790;
case 211:
return 99789;
case 212:
return 99788;
case 213:
return 99787;
case 214:
return 99786;
case 215:
return 99785;
case 216:
return 99784;
case 217:
return 99783;
case 218:
return 99782;
case 219:
return 99781;
case 220:
return 99780;
case 221:
return 99779;
case 222:
return 99778;
case 223:
return 99777;
case 224:
return 99776;
case 225:
return 99775;
case 226:
return 99774;
case 227:
return 99773;
case 228:
return 99772;
case 229:
return 99771;
case 230:
return 99770;
case 231:
return 99769;
case 232:
return 99768;
case 233:
return 99767;
case 234:
return 99766;
case 235:
return 99765;
case 236:
return 99764;
case 237:
return 99763;
case 238:
return 99762;
case 239:
return 99761;
case 240:
return 99760;
case 241:
return 99759;
case 242:
return 99758;
case 243:
return 99757;
case 244:
return 99756;
case 245:
return 99755;
case 246:
return 99754;
case 247:
return 99753;
case 248:
return 99752;
case 249:
return 99751;
case 250:
return 99750;
case 251:
return 99749;
case 252:
return 99748;
case 253:
return 99747;
case 10000:
return 99746;
}
return 0;
}
public int halfSwitch() throws IOException {
switch (my_int) {
case 115:
return 99885;
case 116:
return 99884;
case 117:
return 99883;
case 118:
return 99882;
case 119:
return 99881;
case 120:
return 99880;
case 121:
return 99879;
case 122:
return 99878;
case 123:
return 99877;
case 124:
return 99876;
case 125:
return 99875;
case 126:
return 99874;
case 127:
return 99873;
case 128:
return 99872;
case 129:
return 99871;
case 130:
return 99870;
case 131:
return 99869;
case 132:
return 99868;
case 133:
return 99867;
case 134:
return 99866;
case 135:
return 99865;
case 136:
return 99864;
case 137:
return 99863;
case 138:
return 99862;
case 139:
return 99861;
case 140:
return 99860;
case 141:
return 99859;
case 142:
return 99858;
case 143:
return 99857;
case 144:
return 99856;
case 145:
return 99855;
case 146:
return 99854;
case 147:
return 99853;
case 148:
return 99852;
case 149:
return 99851;
case 150:
return 99850;
case 151:
return 99849;
case 152:
return 99848;
case 153:
return 99847;
case 154:
return 99846;
case 155:
return 99845;
case 156:
return 99844;
case 157:
return 99843;
case 158:
return 99842;
case 159:
return 99841;
case 160:
return 99840;
case 161:
return 99839;
case 162:
return 99838;
case 163:
return 99837;
case 164:
return 99836;
case 165:
return 99835;
case 166:
return 99834;
case 167:
return 99833;
case 168:
return 99832;
case 169:
return 99831;
case 170:
return 99830;
case 171:
return 99829;
case 172:
return 99828;
case 173:
return 99827;
case 174:
return 99826;
case 175:
return 99825;
case 176:
return 99824;
case 177:
return 99823;
case 178:
return 99822;
case 179:
return 99821;
case 180:
return 99820;
case 181:
return 99819;
case 182:
return 99818;
case 183:
return 99817;
case 184:
return 99816;
case 185:
return 99815;
case 186:
return 99814;
case 187:
return 99813;
case 188:
return 99812;
case 189:
return 99811;
case 190:
return 99810;
case 191:
return 99809;
case 192:
return 99808;
case 193:
return 99807;
case 194:
return 99806;
case 195:
return 99805;
case 196:
return 99804;
case 197:
return 99803;
case 198:
return 99802;
case 199:
return 99801;
case 200:
return 99800;
case 201:
return 99799;
case 202:
return 99798;
case 203:
return 99797;
case 204:
return 99796;
case 205:
return 99795;
case 206:
return 99794;
case 207:
return 99793;
case 208:
return 99792;
case 209:
return 99791;
case 210:
return 99790;
case 211:
return 99789;
case 212:
return 99788;
case 213:
return 99787;
case 214:
return 99786;
case 215:
return 99785;
case 216:
return 99784;
case 217:
return 99783;
case 218:
return 99782;
case 219:
return 99781;
case 220:
return 99780;
case 221:
return 99779;
case 222:
return 99778;
case 223:
return 99777;
case 224:
return 99776;
case 225:
return 99775;
case 226:
return 99774;
case 227:
return 99773;
case 228:
return 99772;
case 229:
return 99771;
case 230:
return 99770;
case 231:
return 99769;
case 232:
return 99768;
case 233:
return 99767;
case 234:
return 99766;
case 235:
return 99765;
case 236:
return 99764;
case 237:
return 99763;
case 238:
return 99762;
case 239:
return 99761;
case 240:
return 99760;
case 241:
return 99759;
case 242:
return 99758;
case 243:
return 99757;
case 244:
return 99756;
case 245:
return 99755;
case 246:
return 99754;
case 247:
return 99753;
case 248:
return 99752;
case 249:
return 99751;
case 250:
return 99750;
case 251:
return 99749;
case 252:
return 99748;
case 253:
return 99747;
case 256:
return 99746;
}
return 0;
}
public int tableswitch() throws IOException {
switch (my_int) {
case 1:
return 99999;
case 2:
return 99998;
case 3:
return 99997;
case 4:
return 99996;
case 5:
return 99995;
case 6:
return 99994;
case 7:
return 99993;
case 8:
return 99992;
case 9:
return 99991;
case 10:
return 99990;
case 11:
return 99989;
case 12:
return 99988;
case 13:
return 99987;
case 14:
return 99986;
case 15:
return 99985;
case 16:
return 99984;
case 17:
return 99983;
case 18:
return 99982;
case 19:
return 99981;
case 20:
return 99980;
case 21:
return 99979;
case 22:
return 99978;
case 23:
return 99977;
case 24:
return 99976;
case 25:
return 99975;
case 26:
return 99974;
case 27:
return 99973;
case 28:
return 99972;
case 29:
return 99971;
case 30:
return 99970;
case 31:
return 99969;
case 32:
return 99968;
case 33:
return 99967;
case 34:
return 99966;
case 35:
return 99965;
case 36:
return 99964;
case 37:
return 99963;
case 38:
return 99962;
case 39:
return 99961;
case 40:
return 99960;
case 41:
return 99959;
case 42:
return 99958;
case 43:
return 99957;
case 44:
return 99956;
case 45:
return 99955;
case 46:
return 99954;
case 47:
return 99953;
case 48:
return 99952;
case 49:
return 99951;
case 50:
return 99950;
case 51:
return 99949;
case 52:
return 99948;
case 53:
return 99947;
case 54:
return 99946;
case 55:
return 99945;
case 56:
return 99944;
case 57:
return 99943;
case 58:
return 99942;
case 59:
return 99941;
case 60:
return 99940;
case 61:
return 99939;
case 62:
return 99938;
case 63:
return 99937;
case 64:
return 99936;
case 65:
return 99935;
case 66:
return 99934;
case 67:
return 99933;
case 68:
return 99932;
case 69:
return 99931;
case 70:
return 99930;
case 71:
return 99929;
case 72:
return 99928;
case 73:
return 99927;
case 74:
return 99926;
case 75:
return 99925;
case 76:
return 99924;
case 77:
return 99923;
case 78:
return 99922;
case 79:
return 99921;
case 80:
return 99920;
case 81:
return 99919;
case 82:
return 99918;
case 83:
return 99917;
case 84:
return 99916;
case 85:
return 99915;
case 86:
return 99914;
case 87:
return 99913;
case 88:
return 99912;
case 89:
return 99911;
case 90:
return 99910;
case 91:
return 99909;
case 92:
return 99908;
case 93:
return 99907;
case 94:
return 99906;
case 95:
return 99905;
case 96:
return 99904;
case 97:
return 99903;
case 98:
return 99902;
case 99:
return 99901;
case 100:
return 99900;
case 101:
return 99899;
case 102:
return 99898;
case 103:
return 99897;
case 104:
return 99896;
case 105:
return 99895;
case 106:
return 99894;
case 107:
return 99893;
case 108:
return 99892;
case 109:
return 99891;
case 110:
return 99890;
case 111:
return 99889;
case 112:
return 99888;
case 113:
return 99887;
case 114:
return 99886;
case 115:
return 99885;
case 116:
return 99884;
case 117:
return 99883;
case 118:
return 99882;
case 119:
return 99881;
case 120:
return 99880;
case 121:
return 99879;
case 122:
return 99878;
case 123:
return 99877;
case 124:
return 99876;
case 125:
return 99875;
case 126:
return 99874;
case 127:
return 99873;
case 128:
return 99872;
case 129:
return 99871;
case 130:
return 99870;
case 131:
return 99869;
case 132:
return 99868;
case 133:
return 99867;
case 134:
return 99866;
case 135:
return 99865;
case 136:
return 99864;
case 137:
return 99863;
case 138:
return 99862;
case 139:
return 99861;
case 140:
return 99860;
case 141:
return 99859;
case 142:
return 99858;
case 143:
return 99857;
case 144:
return 99856;
case 145:
return 99855;
case 146:
return 99854;
case 147:
return 99853;
case 148:
return 99852;
case 149:
return 99851;
case 150:
return 99850;
case 151:
return 99849;
case 152:
return 99848;
case 153:
return 99847;
case 154:
return 99846;
case 155:
return 99845;
case 156:
return 99844;
case 157:
return 99843;
case 158:
return 99842;
case 159:
return 99841;
case 160:
return 99840;
case 161:
return 99839;
case 162:
return 99838;
case 163:
return 99837;
case 164:
return 99836;
case 165:
return 99835;
case 166:
return 99834;
case 167:
return 99833;
case 168:
return 99832;
case 169:
return 99831;
case 170:
return 99830;
case 171:
return 99829;
case 172:
return 99828;
case 173:
return 99827;
case 174:
return 99826;
case 175:
return 99825;
case 176:
return 99824;
case 177:
return 99823;
case 178:
return 99822;
case 179:
return 99821;
case 180:
return 99820;
case 181:
return 99819;
case 182:
return 99818;
case 183:
return 99817;
case 184:
return 99816;
case 185:
return 99815;
case 186:
return 99814;
case 187:
return 99813;
case 188:
return 99812;
case 189:
return 99811;
case 190:
return 99810;
case 191:
return 99809;
case 192:
return 99808;
case 193:
return 99807;
case 194:
return 99806;
case 195:
return 99805;
case 196:
return 99804;
case 197:
return 99803;
case 198:
return 99802;
case 199:
return 99801;
case 200:
return 99800;
case 201:
return 99799;
case 202:
return 99798;
case 203:
return 99797;
case 204:
return 99796;
case 205:
return 99795;
case 206:
return 99794;
case 207:
return 99793;
case 208:
return 99792;
case 209:
return 99791;
case 210:
return 99790;
case 211:
return 99789;
case 212:
return 99788;
case 213:
return 99787;
case 214:
return 99786;
case 215:
return 99785;
case 216:
return 99784;
case 217:
return 99783;
case 218:
return 99782;
case 219:
return 99781;
case 220:
return 99780;
case 221:
return 99779;
case 222:
return 99778;
case 223:
return 99777;
case 224:
return 99776;
case 225:
return 99775;
case 226:
return 99774;
case 227:
return 99773;
case 228:
return 99772;
case 229:
return 99771;
case 230:
return 99770;
case 231:
return 99769;
case 232:
return 99768;
case 233:
return 99767;
case 234:
return 99766;
case 235:
return 99765;
case 236:
return 99764;
case 237:
return 99763;
case 238:
return 99762;
case 239:
return 99761;
case 240:
return 99760;
case 241:
return 99759;
case 242:
return 99758;
case 243:
return 99757;
case 244:
return 99756;
case 245:
return 99755;
case 246:
return 99754;
case 247:
return 99753;
case 248:
return 99752;
case 249:
return 99751;
case 250:
return 99750;
case 251:
return 99749;
case 252:
return 99748;
case 253:
return 99747;
case 256:
return 99746;
}
return 0;
}
public static void main(String[] args) throws RunnerException, InterruptedException {
Options opt = new OptionsBuilder().include(Switch.class.getSimpleName()).shouldFailOnError(true).build();
new Runner(opt).run();
}
//Benchmark Mode Cnt Score Error Units
//Switch.branch3 avgt 200 15,913 ± 1,305 ns/op
//Switch.halfSwitch3 avgt 200 115,540 ± 8,991 ns/op
//Switch.lookupswitch3 avgt 200 220,859 ± 19,078 ns/op
//Switch.tableswitch3 avgt 200 218,981 ± 22,573 ns/op
//Switch.branch4 avgt 200 2,588 ± 0,236 ns/op
//Switch.lookupswitch4 avgt 200 4,022 ± 0,461 ns/op
//Switch.tableswitch4 avgt 200 3,450 ± 0,295 ns/op
}
testet JDK11, JDK15, JDK17, Windows 10 x86 64Bit.
A DESCRIPTION OF THE PROBLEM :
Java switch-case statements are compiled to lookupswitch or tableswitch java bytecode. It is expected that for n cases the performance is O(1) for tableswitch and at least O(log(n)) for lookupswitch (see https://stackoverflow.com/questions/10287700/difference-between-jvms-lookupswitch-and-tableswitch). The truth is both are equaly good (C2 level 4) or bad (C2 level 3): For TieredStopAtLevel=3 the switch performance is O(n) :-(.
The problem is that for very big n the code will never reach level 4 but is still slow/hotspot. (real world use case is a java compiler with ~1000 cases per switch - see https://bugs.eclipse.org/bugs/show_bug.cgi?id=574361 )
A possible improvement may be to trigger level 4 after fewer runs for switches with many cases. To get a real O(1) the number of runs needed to get to level 4 would be antiproportional to the number of switch cases. i.e. each case statement should count as a normal run even if the case is not taken.
jmh benchmark to proof O(n) behaviour on level 3:
package benchmarks;
import java.io.IOException;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
@BenchmarkMode(org.openjdk.jmh.annotations.Mode.AverageTime)
@OutputTimeUnit(java.util.concurrent.TimeUnit.NANOSECONDS)
@State(org.openjdk.jmh.annotations.Scope.Thread)
@Warmup(time = 2000, timeUnit = java.util.concurrent.TimeUnit.NANOSECONDS, iterations = 200)
@Measurement(time = 2000, timeUnit = java.util.concurrent.TimeUnit.NANOSECONDS, iterations = 200)
public class Switch {
int my_int;
@Setup
public void setup() {
my_int = 255;
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int branch3() throws IOException {
return branch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int branch4() throws IOException {
return branch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int halfSwitch3() throws IOException {
return halfSwitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int halfSwitch4() throws IOException {
return halfSwitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int lookupswitch3() throws IOException {
return lookupswitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int lookupswitch4() throws IOException {
return lookupswitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=3" })
public int tableswitch3() throws IOException {
return tableswitch();
}
@Benchmark
@Fork(value = 1, jvmArgsAppend = { "-ea", "-XX:TieredStopAtLevel=4" })
public int tableswitch4() throws IOException {
return tableswitch();
}
public int branch() throws IOException {
if (my_int == 1) {
return 99999;
}
return 0;
}
public int lookupswitch() throws IOException {
switch (my_int) {
case 1:
return 99999;
case 2:
return 99998;
case 3:
return 99997;
case 4:
return 99996;
case 5:
return 99995;
case 6:
return 99994;
case 7:
return 99993;
case 8:
return 99992;
case 9:
return 99991;
case 10:
return 99990;
case 11:
return 99989;
case 12:
return 99988;
case 13:
return 99987;
case 14:
return 99986;
case 15:
return 99985;
case 16:
return 99984;
case 17:
return 99983;
case 18:
return 99982;
case 19:
return 99981;
case 20:
return 99980;
case 21:
return 99979;
case 22:
return 99978;
case 23:
return 99977;
case 24:
return 99976;
case 25:
return 99975;
case 26:
return 99974;
case 27:
return 99973;
case 28:
return 99972;
case 29:
return 99971;
case 30:
return 99970;
case 31:
return 99969;
case 32:
return 99968;
case 33:
return 99967;
case 34:
return 99966;
case 35:
return 99965;
case 36:
return 99964;
case 37:
return 99963;
case 38:
return 99962;
case 39:
return 99961;
case 40:
return 99960;
case 41:
return 99959;
case 42:
return 99958;
case 43:
return 99957;
case 44:
return 99956;
case 45:
return 99955;
case 46:
return 99954;
case 47:
return 99953;
case 48:
return 99952;
case 49:
return 99951;
case 50:
return 99950;
case 51:
return 99949;
case 52:
return 99948;
case 53:
return 99947;
case 54:
return 99946;
case 55:
return 99945;
case 56:
return 99944;
case 57:
return 99943;
case 58:
return 99942;
case 59:
return 99941;
case 60:
return 99940;
case 61:
return 99939;
case 62:
return 99938;
case 63:
return 99937;
case 64:
return 99936;
case 65:
return 99935;
case 66:
return 99934;
case 67:
return 99933;
case 68:
return 99932;
case 69:
return 99931;
case 70:
return 99930;
case 71:
return 99929;
case 72:
return 99928;
case 73:
return 99927;
case 74:
return 99926;
case 75:
return 99925;
case 76:
return 99924;
case 77:
return 99923;
case 78:
return 99922;
case 79:
return 99921;
case 80:
return 99920;
case 81:
return 99919;
case 82:
return 99918;
case 83:
return 99917;
case 84:
return 99916;
case 85:
return 99915;
case 86:
return 99914;
case 87:
return 99913;
case 88:
return 99912;
case 89:
return 99911;
case 90:
return 99910;
case 91:
return 99909;
case 92:
return 99908;
case 93:
return 99907;
case 94:
return 99906;
case 95:
return 99905;
case 96:
return 99904;
case 97:
return 99903;
case 98:
return 99902;
case 99:
return 99901;
case 100:
return 99900;
case 101:
return 99899;
case 102:
return 99898;
case 103:
return 99897;
case 104:
return 99896;
case 105:
return 99895;
case 106:
return 99894;
case 107:
return 99893;
case 108:
return 99892;
case 109:
return 99891;
case 110:
return 99890;
case 111:
return 99889;
case 112:
return 99888;
case 113:
return 99887;
case 114:
return 99886;
case 115:
return 99885;
case 116:
return 99884;
case 117:
return 99883;
case 118:
return 99882;
case 119:
return 99881;
case 120:
return 99880;
case 121:
return 99879;
case 122:
return 99878;
case 123:
return 99877;
case 124:
return 99876;
case 125:
return 99875;
case 126:
return 99874;
case 127:
return 99873;
case 128:
return 99872;
case 129:
return 99871;
case 130:
return 99870;
case 131:
return 99869;
case 132:
return 99868;
case 133:
return 99867;
case 134:
return 99866;
case 135:
return 99865;
case 136:
return 99864;
case 137:
return 99863;
case 138:
return 99862;
case 139:
return 99861;
case 140:
return 99860;
case 141:
return 99859;
case 142:
return 99858;
case 143:
return 99857;
case 144:
return 99856;
case 145:
return 99855;
case 146:
return 99854;
case 147:
return 99853;
case 148:
return 99852;
case 149:
return 99851;
case 150:
return 99850;
case 151:
return 99849;
case 152:
return 99848;
case 153:
return 99847;
case 154:
return 99846;
case 155:
return 99845;
case 156:
return 99844;
case 157:
return 99843;
case 158:
return 99842;
case 159:
return 99841;
case 160:
return 99840;
case 161:
return 99839;
case 162:
return 99838;
case 163:
return 99837;
case 164:
return 99836;
case 165:
return 99835;
case 166:
return 99834;
case 167:
return 99833;
case 168:
return 99832;
case 169:
return 99831;
case 170:
return 99830;
case 171:
return 99829;
case 172:
return 99828;
case 173:
return 99827;
case 174:
return 99826;
case 175:
return 99825;
case 176:
return 99824;
case 177:
return 99823;
case 178:
return 99822;
case 179:
return 99821;
case 180:
return 99820;
case 181:
return 99819;
case 182:
return 99818;
case 183:
return 99817;
case 184:
return 99816;
case 185:
return 99815;
case 186:
return 99814;
case 187:
return 99813;
case 188:
return 99812;
case 189:
return 99811;
case 190:
return 99810;
case 191:
return 99809;
case 192:
return 99808;
case 193:
return 99807;
case 194:
return 99806;
case 195:
return 99805;
case 196:
return 99804;
case 197:
return 99803;
case 198:
return 99802;
case 199:
return 99801;
case 200:
return 99800;
case 201:
return 99799;
case 202:
return 99798;
case 203:
return 99797;
case 204:
return 99796;
case 205:
return 99795;
case 206:
return 99794;
case 207:
return 99793;
case 208:
return 99792;
case 209:
return 99791;
case 210:
return 99790;
case 211:
return 99789;
case 212:
return 99788;
case 213:
return 99787;
case 214:
return 99786;
case 215:
return 99785;
case 216:
return 99784;
case 217:
return 99783;
case 218:
return 99782;
case 219:
return 99781;
case 220:
return 99780;
case 221:
return 99779;
case 222:
return 99778;
case 223:
return 99777;
case 224:
return 99776;
case 225:
return 99775;
case 226:
return 99774;
case 227:
return 99773;
case 228:
return 99772;
case 229:
return 99771;
case 230:
return 99770;
case 231:
return 99769;
case 232:
return 99768;
case 233:
return 99767;
case 234:
return 99766;
case 235:
return 99765;
case 236:
return 99764;
case 237:
return 99763;
case 238:
return 99762;
case 239:
return 99761;
case 240:
return 99760;
case 241:
return 99759;
case 242:
return 99758;
case 243:
return 99757;
case 244:
return 99756;
case 245:
return 99755;
case 246:
return 99754;
case 247:
return 99753;
case 248:
return 99752;
case 249:
return 99751;
case 250:
return 99750;
case 251:
return 99749;
case 252:
return 99748;
case 253:
return 99747;
case 10000:
return 99746;
}
return 0;
}
public int halfSwitch() throws IOException {
switch (my_int) {
case 115:
return 99885;
case 116:
return 99884;
case 117:
return 99883;
case 118:
return 99882;
case 119:
return 99881;
case 120:
return 99880;
case 121:
return 99879;
case 122:
return 99878;
case 123:
return 99877;
case 124:
return 99876;
case 125:
return 99875;
case 126:
return 99874;
case 127:
return 99873;
case 128:
return 99872;
case 129:
return 99871;
case 130:
return 99870;
case 131:
return 99869;
case 132:
return 99868;
case 133:
return 99867;
case 134:
return 99866;
case 135:
return 99865;
case 136:
return 99864;
case 137:
return 99863;
case 138:
return 99862;
case 139:
return 99861;
case 140:
return 99860;
case 141:
return 99859;
case 142:
return 99858;
case 143:
return 99857;
case 144:
return 99856;
case 145:
return 99855;
case 146:
return 99854;
case 147:
return 99853;
case 148:
return 99852;
case 149:
return 99851;
case 150:
return 99850;
case 151:
return 99849;
case 152:
return 99848;
case 153:
return 99847;
case 154:
return 99846;
case 155:
return 99845;
case 156:
return 99844;
case 157:
return 99843;
case 158:
return 99842;
case 159:
return 99841;
case 160:
return 99840;
case 161:
return 99839;
case 162:
return 99838;
case 163:
return 99837;
case 164:
return 99836;
case 165:
return 99835;
case 166:
return 99834;
case 167:
return 99833;
case 168:
return 99832;
case 169:
return 99831;
case 170:
return 99830;
case 171:
return 99829;
case 172:
return 99828;
case 173:
return 99827;
case 174:
return 99826;
case 175:
return 99825;
case 176:
return 99824;
case 177:
return 99823;
case 178:
return 99822;
case 179:
return 99821;
case 180:
return 99820;
case 181:
return 99819;
case 182:
return 99818;
case 183:
return 99817;
case 184:
return 99816;
case 185:
return 99815;
case 186:
return 99814;
case 187:
return 99813;
case 188:
return 99812;
case 189:
return 99811;
case 190:
return 99810;
case 191:
return 99809;
case 192:
return 99808;
case 193:
return 99807;
case 194:
return 99806;
case 195:
return 99805;
case 196:
return 99804;
case 197:
return 99803;
case 198:
return 99802;
case 199:
return 99801;
case 200:
return 99800;
case 201:
return 99799;
case 202:
return 99798;
case 203:
return 99797;
case 204:
return 99796;
case 205:
return 99795;
case 206:
return 99794;
case 207:
return 99793;
case 208:
return 99792;
case 209:
return 99791;
case 210:
return 99790;
case 211:
return 99789;
case 212:
return 99788;
case 213:
return 99787;
case 214:
return 99786;
case 215:
return 99785;
case 216:
return 99784;
case 217:
return 99783;
case 218:
return 99782;
case 219:
return 99781;
case 220:
return 99780;
case 221:
return 99779;
case 222:
return 99778;
case 223:
return 99777;
case 224:
return 99776;
case 225:
return 99775;
case 226:
return 99774;
case 227:
return 99773;
case 228:
return 99772;
case 229:
return 99771;
case 230:
return 99770;
case 231:
return 99769;
case 232:
return 99768;
case 233:
return 99767;
case 234:
return 99766;
case 235:
return 99765;
case 236:
return 99764;
case 237:
return 99763;
case 238:
return 99762;
case 239:
return 99761;
case 240:
return 99760;
case 241:
return 99759;
case 242:
return 99758;
case 243:
return 99757;
case 244:
return 99756;
case 245:
return 99755;
case 246:
return 99754;
case 247:
return 99753;
case 248:
return 99752;
case 249:
return 99751;
case 250:
return 99750;
case 251:
return 99749;
case 252:
return 99748;
case 253:
return 99747;
case 256:
return 99746;
}
return 0;
}
public int tableswitch() throws IOException {
switch (my_int) {
case 1:
return 99999;
case 2:
return 99998;
case 3:
return 99997;
case 4:
return 99996;
case 5:
return 99995;
case 6:
return 99994;
case 7:
return 99993;
case 8:
return 99992;
case 9:
return 99991;
case 10:
return 99990;
case 11:
return 99989;
case 12:
return 99988;
case 13:
return 99987;
case 14:
return 99986;
case 15:
return 99985;
case 16:
return 99984;
case 17:
return 99983;
case 18:
return 99982;
case 19:
return 99981;
case 20:
return 99980;
case 21:
return 99979;
case 22:
return 99978;
case 23:
return 99977;
case 24:
return 99976;
case 25:
return 99975;
case 26:
return 99974;
case 27:
return 99973;
case 28:
return 99972;
case 29:
return 99971;
case 30:
return 99970;
case 31:
return 99969;
case 32:
return 99968;
case 33:
return 99967;
case 34:
return 99966;
case 35:
return 99965;
case 36:
return 99964;
case 37:
return 99963;
case 38:
return 99962;
case 39:
return 99961;
case 40:
return 99960;
case 41:
return 99959;
case 42:
return 99958;
case 43:
return 99957;
case 44:
return 99956;
case 45:
return 99955;
case 46:
return 99954;
case 47:
return 99953;
case 48:
return 99952;
case 49:
return 99951;
case 50:
return 99950;
case 51:
return 99949;
case 52:
return 99948;
case 53:
return 99947;
case 54:
return 99946;
case 55:
return 99945;
case 56:
return 99944;
case 57:
return 99943;
case 58:
return 99942;
case 59:
return 99941;
case 60:
return 99940;
case 61:
return 99939;
case 62:
return 99938;
case 63:
return 99937;
case 64:
return 99936;
case 65:
return 99935;
case 66:
return 99934;
case 67:
return 99933;
case 68:
return 99932;
case 69:
return 99931;
case 70:
return 99930;
case 71:
return 99929;
case 72:
return 99928;
case 73:
return 99927;
case 74:
return 99926;
case 75:
return 99925;
case 76:
return 99924;
case 77:
return 99923;
case 78:
return 99922;
case 79:
return 99921;
case 80:
return 99920;
case 81:
return 99919;
case 82:
return 99918;
case 83:
return 99917;
case 84:
return 99916;
case 85:
return 99915;
case 86:
return 99914;
case 87:
return 99913;
case 88:
return 99912;
case 89:
return 99911;
case 90:
return 99910;
case 91:
return 99909;
case 92:
return 99908;
case 93:
return 99907;
case 94:
return 99906;
case 95:
return 99905;
case 96:
return 99904;
case 97:
return 99903;
case 98:
return 99902;
case 99:
return 99901;
case 100:
return 99900;
case 101:
return 99899;
case 102:
return 99898;
case 103:
return 99897;
case 104:
return 99896;
case 105:
return 99895;
case 106:
return 99894;
case 107:
return 99893;
case 108:
return 99892;
case 109:
return 99891;
case 110:
return 99890;
case 111:
return 99889;
case 112:
return 99888;
case 113:
return 99887;
case 114:
return 99886;
case 115:
return 99885;
case 116:
return 99884;
case 117:
return 99883;
case 118:
return 99882;
case 119:
return 99881;
case 120:
return 99880;
case 121:
return 99879;
case 122:
return 99878;
case 123:
return 99877;
case 124:
return 99876;
case 125:
return 99875;
case 126:
return 99874;
case 127:
return 99873;
case 128:
return 99872;
case 129:
return 99871;
case 130:
return 99870;
case 131:
return 99869;
case 132:
return 99868;
case 133:
return 99867;
case 134:
return 99866;
case 135:
return 99865;
case 136:
return 99864;
case 137:
return 99863;
case 138:
return 99862;
case 139:
return 99861;
case 140:
return 99860;
case 141:
return 99859;
case 142:
return 99858;
case 143:
return 99857;
case 144:
return 99856;
case 145:
return 99855;
case 146:
return 99854;
case 147:
return 99853;
case 148:
return 99852;
case 149:
return 99851;
case 150:
return 99850;
case 151:
return 99849;
case 152:
return 99848;
case 153:
return 99847;
case 154:
return 99846;
case 155:
return 99845;
case 156:
return 99844;
case 157:
return 99843;
case 158:
return 99842;
case 159:
return 99841;
case 160:
return 99840;
case 161:
return 99839;
case 162:
return 99838;
case 163:
return 99837;
case 164:
return 99836;
case 165:
return 99835;
case 166:
return 99834;
case 167:
return 99833;
case 168:
return 99832;
case 169:
return 99831;
case 170:
return 99830;
case 171:
return 99829;
case 172:
return 99828;
case 173:
return 99827;
case 174:
return 99826;
case 175:
return 99825;
case 176:
return 99824;
case 177:
return 99823;
case 178:
return 99822;
case 179:
return 99821;
case 180:
return 99820;
case 181:
return 99819;
case 182:
return 99818;
case 183:
return 99817;
case 184:
return 99816;
case 185:
return 99815;
case 186:
return 99814;
case 187:
return 99813;
case 188:
return 99812;
case 189:
return 99811;
case 190:
return 99810;
case 191:
return 99809;
case 192:
return 99808;
case 193:
return 99807;
case 194:
return 99806;
case 195:
return 99805;
case 196:
return 99804;
case 197:
return 99803;
case 198:
return 99802;
case 199:
return 99801;
case 200:
return 99800;
case 201:
return 99799;
case 202:
return 99798;
case 203:
return 99797;
case 204:
return 99796;
case 205:
return 99795;
case 206:
return 99794;
case 207:
return 99793;
case 208:
return 99792;
case 209:
return 99791;
case 210:
return 99790;
case 211:
return 99789;
case 212:
return 99788;
case 213:
return 99787;
case 214:
return 99786;
case 215:
return 99785;
case 216:
return 99784;
case 217:
return 99783;
case 218:
return 99782;
case 219:
return 99781;
case 220:
return 99780;
case 221:
return 99779;
case 222:
return 99778;
case 223:
return 99777;
case 224:
return 99776;
case 225:
return 99775;
case 226:
return 99774;
case 227:
return 99773;
case 228:
return 99772;
case 229:
return 99771;
case 230:
return 99770;
case 231:
return 99769;
case 232:
return 99768;
case 233:
return 99767;
case 234:
return 99766;
case 235:
return 99765;
case 236:
return 99764;
case 237:
return 99763;
case 238:
return 99762;
case 239:
return 99761;
case 240:
return 99760;
case 241:
return 99759;
case 242:
return 99758;
case 243:
return 99757;
case 244:
return 99756;
case 245:
return 99755;
case 246:
return 99754;
case 247:
return 99753;
case 248:
return 99752;
case 249:
return 99751;
case 250:
return 99750;
case 251:
return 99749;
case 252:
return 99748;
case 253:
return 99747;
case 256:
return 99746;
}
return 0;
}
public static void main(String[] args) throws RunnerException, InterruptedException {
Options opt = new OptionsBuilder().include(Switch.class.getSimpleName()).shouldFailOnError(true).build();
new Runner(opt).run();
}
//Benchmark Mode Cnt Score Error Units
//Switch.branch3 avgt 200 15,913 ± 1,305 ns/op
//Switch.halfSwitch3 avgt 200 115,540 ± 8,991 ns/op
//Switch.lookupswitch3 avgt 200 220,859 ± 19,078 ns/op
//Switch.tableswitch3 avgt 200 218,981 ± 22,573 ns/op
//Switch.branch4 avgt 200 2,588 ± 0,236 ns/op
//Switch.lookupswitch4 avgt 200 4,022 ± 0,461 ns/op
//Switch.tableswitch4 avgt 200 3,450 ± 0,295 ns/op
}