История изменений
Исправление alysnix, (текущая версия) :
оба варианта функционально эквивалентны, но второй будет преобразован в первый при оптимизации, поскольку кода меньше.
первый вариант предпочтительней из-за читабельности(надо только отформатировать нормально).
обычно оператор case в разных языках генерится как таблица переходов, и он работает быстрей при наличии многих вариантов, близких по значению, типа разница между большим и меньшим невелика - например 256 тогда получится таблица в 256 переходов.
но поскольку конструкции вида
switch (x) {
case 0: .... break;
case 10000: .... break;
default: break;
}
при табличной реализации даст таблицу в 10000 переходов, где заполнены только два, то для экономии памяти компилятор будет генерить код в виде двух if:
if(x == 0) {...}
else if (x == 10000) {...}
else {}
могут быть смешаные случаи типа
switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;
case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
default: break;
}
в принципе может генериться как два switch оператора, то есть будут две короткие таблицы.
if(x<10000) {
switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;
}
else {
switch(x){
case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
}
}
также короткий(мало вариантов) switch типа
switch(x){
case 10000: .... break;
case 10001: .... break;
}
компилятор скорее заменит на if, поскольку if будет выполняться быстрее тут.
Исправление alysnix, :
оба варианта функционально эквивалентны, но второй будет преобразован в первый при оптимизации, поскольку кода меньше.
первый вариант предпочтительней из-за читабельности(надо только отформатировать нормально).
обычно оператор case в разных языках генерится как таблица переходов, и он работает быстрей при наличии многих вариантов, близких по значению, типа разница между большим и меньшим невелика - например 256 тогда получится таблица в 256 переходов.
но поскольку конструкции вида
switch (x) {
case 0: .... break;
case 10000: .... break;
default: break;
}
при табличной реализации даст таблицу в 10000 переходов, где заполнены только два, то для экономии памяти компилятор будет генерить код в виде двух if:
if(x == 0) {...}
else if (x == 10000) {...}
else {}
могут быть смешаные случаи типа
switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;
case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
default: break;
}
в принципе может генериться как два switch оператора, то есть будет имеется две короткие таблицы.
if(x<10000) {
switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;
}
else {
switch(x){
case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
}
}
также короткий(мало вариантов) switch типа
switch(x){
case 10000: .... break;
case 10001: .... break;
}
компилятор скорее заменит на if, поскольку if будет выполняться быстрее тут.
Исходная версия alysnix, :
оба варианта функционально эквивалентны, но второй будет преобразован в первый при оптимизации, поскольку кода меньше.
первый вариант предпочтительней из-за читабельности.
обычно оператор case в разных языках генерится как таблица переходов, и он работает быстрей при наличии многих вариантов, близких по значению, типа разница между большим и меньшим невелика - например 256 тогда получится таблица в 256 переходов.
но поскольку конструкции вида
switch (x) {
case 0: .... break;
case 10000: .... break;
default: break;
}
при табличной реализации даст таблицу в 10000 переходов, где заполнены только два, то для экономии памяти компилятор будет генерить код в виде двух if:
if(x == 0) {...}
else if (x == 10000) {...}
else {}
могут быть смешаные случаи типа
switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;
case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
default: break;
}
в принципе может генериться как два switch оператора, то есть будет имеется две короткие таблицы.
if(x<10000) {
switch (x) {
case 0: .... break;
case 1: .... break;
case 2: .... break;
}
else {
switch(x){
case 10000: .... break;
case 10001: .... break;
case 10002: .... break;
}
}
также короткий(мало вариантов) switch типа
switch(x){
case 10000: .... break;
case 10001: .... break;
}
компилятор скорее заменит на if, поскольку if будет выполняться быстрее тут.