LINUX.ORG.RU

История изменений

Исправление 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 уже не играет роли. Я думаю, замедление происходит в момент добавления буквы к всё удлинняющейся строке. Область использования транслита - это, конечно, короткие куски текста. Поэтому длинные тесты я выкинул только что. Но замедление вдвое - надо ли ради него так сильно париться? Я ещё подумаю над этим.