История изменений
Исправление den73, (текущая версия) :
Полностью избавиться от switch нельзя, поскольку нужно выполнять разный код в зависимости от буквы. Если это делать через лямбды, то получается в 20 раз медленнее, согласно
https://jsperf.com/switch-vs-object-function
Значит, нужно часть оставить в виде switch, а дальше выделять диапазоны букв и там уже через массив. Я заменил вот такой код
case 'A': Зб('А'); break; case 'a': Зб('а'); break;
case 'B': Зб('Б'); break; case 'b': Зб('б'); break;
case 'V': Зб('В'); break; case 'v': Зб('в'); break;
case 'G': Зб('Г'); break; case 'g': Зб('г'); break;
case 'D': Зб('Д'); break; case 'd': Зб('д'); break;
case 'E': Зб('Е'); break; case 'e': Зб('е'); break;
case 'Z': Зб('З'); break; case 'z': Зб('з'); break;
case 'I': Зб('И'); break; case 'i': Зб('и'); break;
case 'K': Зб('К'); break; case 'k': Зб('к'); break;
case 'L': Зб('Л'); break; case 'l': Зб('л'); break;
case 'M': Зб('М'); break; case 'm': Зб('м'); break;
case 'N': Зб('Н'); break; case 'n': Зб('н'); break;
case 'O': Зб('О'); break; case 'o': Зб('о'); break;
case 'P': Зб('П'); break; case 'p': Зб('п'); break;
case 'R': Зб('Р'); break; case 'r': Зб('р'); break;
case 'S': Зб('С'); break; case 's': Зб('с'); break;
case 'T': Зб('Т'); break; case 't': Зб('т'); break;
case 'U': Зб('У'); break; case 'u': Зб('у'); break;
case 'F': Зб('Ф'); break; case 'f': Зб('ф'); break;
case 'C': Зб('Ц'); break; case 'c': Зб('ц'); break;
case 'Y': Зб('Ы'); break; case 'y': Зб('ы'); break;
case 'Q': Зб('Ь'); break; case 'q': Зб('ь'); break;
, на такой вот код:
default:
Код = б.charCodeAt(0);
// a..z
if (97 <= Код && Код <= 122) {
Зб(Таблица1[Код-97])
} else if (65 <= Код && Код <= 90) {
Зб(Таблица2[Код-65])
} else Зб(б);
Замер показал следующее: вариант со switch примерно вдвое медленнее для текста длиной порядка нескольких сотен букв. Для длинного текста основной фактор замедления - это длина текста и там switch уже не играет роли. Я думаю, замедление происходит в момент добавления буквы ко всё удлинняющейся строке. Область использования транслита - это, конечно, короткие куски текста. Поэтому длинные тексты я выкинул только что. Но замедление вдвое - надо ли ради него так сильно париться? Я ещё подумаю над этим.
Исправление den73, :
Полностью избавиться от switch нельзя, поскольку нужно выполнять разный код в зависимости от буквы. Если это делать через лямбды, то получается в 20 раз медленнее, согласно
https://jsperf.com/switch-vs-object-function
Значит, нужно часть оставить в виде switch, а дальше выделять диапазоны букв и там уже через массив. Я заменил вот такой код
case 'A': Зб('А'); break; case 'a': Зб('а'); break;
case 'B': Зб('Б'); break; case 'b': Зб('б'); break;
case 'V': Зб('В'); break; case 'v': Зб('в'); break;
case 'G': Зб('Г'); break; case 'g': Зб('г'); break;
case 'D': Зб('Д'); break; case 'd': Зб('д'); break;
case 'E': Зб('Е'); break; case 'e': Зб('е'); break;
case 'Z': Зб('З'); break; case 'z': Зб('з'); break;
case 'I': Зб('И'); break; case 'i': Зб('и'); break;
case 'K': Зб('К'); break; case 'k': Зб('к'); break;
case 'L': Зб('Л'); break; case 'l': Зб('л'); break;
case 'M': Зб('М'); break; case 'm': Зб('м'); break;
case 'N': Зб('Н'); break; case 'n': Зб('н'); break;
case 'O': Зб('О'); break; case 'o': Зб('о'); break;
case 'P': Зб('П'); break; case 'p': Зб('п'); break;
case 'R': Зб('Р'); break; case 'r': Зб('р'); break;
case 'S': Зб('С'); break; case 's': Зб('с'); break;
case 'T': Зб('Т'); break; case 't': Зб('т'); break;
case 'U': Зб('У'); break; case 'u': Зб('у'); break;
case 'F': Зб('Ф'); break; case 'f': Зб('ф'); break;
case 'C': Зб('Ц'); break; case 'c': Зб('ц'); break;
case 'Y': Зб('Ы'); break; case 'y': Зб('ы'); break;
case 'Q': Зб('Ь'); break; case 'q': Зб('ь'); break;
, на такой вот код:
default:
Код = б.charCodeAt(0);
// a..z
if (97 <= Код && Код <= 122) {
Зб(Таблица1[Код-97])
} else if (65 <= Код && Код <= 90) {
Зб(Таблица2[Код-65])
} else Зб(б);
Замер показал следующее: вариант со switch примерно вдвое медленнее для текста длиной порядка нескольких сотен букв. Для длинного текста основной фактор замедления - это длина текста и там switch уже не играет роли. Я думаю, замедление происходит в момент добавления буквы ко всё удлинняющейся строке. Область использования транслита - это, конечно, короткие куски текста. Поэтому длинные тесты я выкинул только что. Но замедление вдвое - надо ли ради него так сильно париться? Я ещё подумаю над этим.
Исходная версия den73, :
Полностью избавиться от switch нельзя, поскольку нужно выполнять разный код в зависимости от буквы. Если это делать через лямбды, то получается в 20 раз медленнее, согласно
https://jsperf.com/switch-vs-object-function
Значит, нужно часть оставить в виде switch, а дальше выделять диапазоны букв и там уже через массив. Я заменил вот такой код
case 'A': Зб('А'); break; case 'a': Зб('а'); break;
case 'B': Зб('Б'); break; case 'b': Зб('б'); break;
case 'V': Зб('В'); break; case 'v': Зб('в'); break;
case 'G': Зб('Г'); break; case 'g': Зб('г'); break;
case 'D': Зб('Д'); break; case 'd': Зб('д'); break;
case 'E': Зб('Е'); break; case 'e': Зб('е'); break;
case 'Z': Зб('З'); break; case 'z': Зб('з'); break;
case 'I': Зб('И'); break; case 'i': Зб('и'); break;
case 'K': Зб('К'); break; case 'k': Зб('к'); break;
case 'L': Зб('Л'); break; case 'l': Зб('л'); break;
case 'M': Зб('М'); break; case 'm': Зб('м'); break;
case 'N': Зб('Н'); break; case 'n': Зб('н'); break;
case 'O': Зб('О'); break; case 'o': Зб('о'); break;
case 'P': Зб('П'); break; case 'p': Зб('п'); break;
case 'R': Зб('Р'); break; case 'r': Зб('р'); break;
case 'S': Зб('С'); break; case 's': Зб('с'); break;
case 'T': Зб('Т'); break; case 't': Зб('т'); break;
case 'U': Зб('У'); break; case 'u': Зб('у'); break;
case 'F': Зб('Ф'); break; case 'f': Зб('ф'); break;
case 'C': Зб('Ц'); break; case 'c': Зб('ц'); break;
case 'Y': Зб('Ы'); break; case 'y': Зб('ы'); break;
case 'Q': Зб('Ь'); break; case 'q': Зб('ь'); break;
, на такой вот код:
default:
Код = б.charCodeAt(0);
// a..z
if (97 <= Код && Код <= 122) {
Зб(Таблица1[Код-97])
} else if (65 <= Код && Код <= 90) {
Зб(Таблица2[Код-65])
} else Зб(б);
Замер показал следующее: вариант со switch примерно вдвое медленнее для текста длиной порядка нескольких сотен букв. Для длинного текста основной фактор замедления - это длина текста и там switch уже не играет роли. Я думаю, замедление происходит в момент добавления буквы к всё удлинняющейся строке. Область использования транслита - это, конечно, короткие куски текста. Поэтому длинные тесты я выкинул только что. Но замедление вдвое - надо ли ради него так сильно париться? Я ещё подумаю над этим.