Какой из более массивных элементов array.includes или string.includes?
Я пытаюсь выяснить, что более результативно:
let array = [1,2,3,4]
array.includes(4)
или
let str = "1234";
str.includes(4);
и попытались выяснить это, выполнив:
console.time();
let ar = [1,2,3,4,5];
ar.includes(4);
console.timeEnd();
console.time();
let str = "12345";
str.includes("4");
console.timeEnd();
в консоли и с script на странице. При непосредственном выполнении с консоли время такое, что array.includes занимает наименьшее время. При выполнении с страницы время, указанное так, что string.includes занимает меньше времени. Что дает?!
Ответы
Ответ 1
С небольшим количеством значений для тестирования против:
Заключение: array.includes
быстрее, чем string.includes
Затем я попытался увеличить количество значений до ~ 100:
Заканчивается с теми же результатами: array.includes
быстрее, чем string.includes
Если вас интересует алгоритм реализации, вы можете посмотреть его здесь:
PS: В вашем случае, я думаю, что объявление переменной занимает больше времени в тесте Array Incldues, чем объявление строки. Если вы выведете декларацию из таймера, вы также увидите согласованные результаты.
Доказательство: ![Доказательство]()
Объявление строки принимает 1/10-е время, которое требуется для объявления массива
Ответ 2
На основе тестовых тестов на разных платформах браузеров все зависит от Javascript Engine и элементов времени выполнения на этих платформах (Windows, Mac или Ubuntu)
Chrome на Mac OS дала Array.includes
быстрее, чем String.includes
в Safari Mac OS, это было наоборот. (тестовый файл jsperf.com, созданный @shashanka n)
и Node v8.0.0 в Mac OS String.includes
отображаются быстрее, чем Array.includes
с результатом ниже
![введите описание изображения здесь]()
Node исходный код тестового примера:
let ar = [1,2,3,4,5];
console.time("Array");
ar.includes(4);
console.timeEnd("Array");
let str = "1,2,3,4,5";
console.time("String");
str.includes("4");
console.timeEnd("String");
Вышеупомянутая тестовая версия в Chrome ![введите описание изображения здесь]()
Иногда неоднозначность тестового случая может привести к разным результатам. Нет никакого определенного метода для привязки производительности API, все, что мы можем, мы можем сэкономить несколько миллисекунд и жить с этим до тех пор, пока это действительно не повлияет на производительность в более крупном масштабе или не будет препятствовать.
Ответ 3
Я проверил строки вместо числа, потому что одним из важных элементов является преобразование числа/строки в процессе.
![array.includes vs string.includes comparison]()
Массив все еще намного быстрее...
Вот мои 2 теста
var ar = ['a','b','c', 'd', 'e'];
var str = "abcde";
jsFiddle test