Использование join("")
было уловкой оптимизации для составления больших строк в IE6, чтобы избежать O(n**2)
буферных копий. Никогда не ожидалось, что это будет огромный выигрыш в производительности для составления небольших строк, поскольку O(n**2)
действительно доминирует только над издержками массива для больших n.
Современные интерпретаторы обходят это, используя «зависимые строки». См. Эту ошибку Mozilla для объяснения зависимых строк и некоторых преимуществ и недостатков.
В основном современные интерпретаторы знают о множестве различных типов строк:
- Массив символов
- Срез (подстрока) другой строки
- Объединение двух других строк
Это делает конкатенацию и подстроку O (1) ценой того, что иногда остается слишком много живого подстрокового буфера, что приводит к неэффективности или сложности в сборщике мусора.
Некоторые современные интерпретаторы поиграли с идеей дальнейшего разложения (1) на байты [] для строк только в ASCII и массивы uint16s, когда строка содержит кодовую единицу UTF-16, которая не может вписаться в один байт. , Но я не знаю, есть ли эта идея в каком-либо переводчике.