После того, как я обнаружил, что общие/последние реализации Javascript используют String Interning для повышения производительности (Используют ли общие реализации JavaScript для интернирования строк?), я думал, что ===
для строк получилось бы постоянное время O (1). Поэтому я дал неверный ответ на этот вопрос:
Сравнение производительности равенства строк в JavaScript
Так как согласно OP этого вопроса O (N), удвоение ввода строки удваивает время, необходимое для равенства. Он не предоставил jsPerf, поэтому требуется больше исследований,
Таким образом, мой сценарий с использованием интернирования строк будет выглядеть следующим образом:
var str1 = "stringwithmillionchars"; //stored in address 51242
var str2 = "stringwithmillionchars"; //stored in address 12313
"stringwithmillionchars" будет храниться один раз, если скажем в адресе 201012 памяти и оба str1 и str2 будут "указывать" на этот адрес 201012. Затем этот адрес можно определить с помощью какого-либо хэширования для сопоставления с определенными местоположениями в памяти.
Поэтому при выполнении
"stringwithmillionchars" === "stringwithmillionchars"
будет выглядеть как
getContentOfAddress(51242)===getContentOfAddress(12313)
или 201012 === 201012
который принимает O (1)/постоянное время
Обновления JSPerfs/Performance:
JSPerf, похоже, показывает постоянное время, даже если строка в 16 раз длиннее? Пожалуйста, посмотрите:
http://jsperf.com/eqaulity-is-constant-time
Вероятно, строки слишком малы по приведенному выше: Вероятно, это показывает линейное время (благодаря sergioFC) строки строятся с петлей. Я пробовал без функций - все еще линейное время/я немного изменил его http://jsfiddle.net/f8yf3c7d/3/.
В соответствии с https://www.dropbox.com/s/8ty3hev1b109qjj/compare.html?dl=0 (файл размером 12 МБ, созданный sergioFC), когда у вас есть строка, и вы уже присвоили значение в кавычках no важно, насколько велики t1 и t2 (например, 5930496 символов), он принимает 0-1ms/мгновенное время.
Похоже, что когда вы создаете строку, используя цикл for или функцию, строка не интернирована. Таким образом, интернирование происходит только тогда, когда вы напрямую назначаете строку с кавычками вроде var str = "test";