Какой из более массивных элементов 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