Производительность: typeof против instanceof - PullRequest
0 голосов
/ 03 мая 2018

Мне было интересно, какой из typeof и instanceof является более производительным, поэтому я собрал следующую мелочь:

let TIMES = 1000 * 1000 * 100

console.time("(() => { }) instanceof Function")
for (let i = 0; i < TIMES; i++)
  (() => { }) instanceof Function
console.timeEnd("(() => { }) instanceof Function")

console.time("(async () => { }) instanceof Function")
for (let i = 0; i < TIMES; i++)
  (async () => { }) instanceof Function
console.timeEnd("(async () => { }) instanceof Function")

console.time("(function () { }) instanceof Function")
for (let i = 0; i < TIMES; i++)
  (function () { }) instanceof Function
console.timeEnd("(function () { }) instanceof Function")

console.time("(async function () { }) instanceof Function")
for (let i = 0; i < TIMES; i++)
  (async function () { }) instanceof Function
console.timeEnd("(async function () { }) instanceof Function")

console.time("typeof (() => { }) === 'function'")
for (let i = 0; i < TIMES; i++)
  typeof (() => { }) === 'function'
console.timeEnd("typeof (() => { }) === 'function'")

console.time("typeof (async () => { }) === 'function'")
for (let i = 0; i < TIMES; i++)
  typeof (async () => { }) === 'function'
console.timeEnd("typeof (async () => { }) === 'function'")

console.time("typeof (function () { }) === 'function'")
for (let i = 0; i < TIMES; i++)
  typeof (function () { }) === 'function'
console.timeEnd("typeof (function () { }) === 'function'")

console.time("typeof (async function () { }) === 'function'")
for (let i = 0; i < TIMES; i++)
  typeof (async function () { }) === 'function'
console.timeEnd("typeof (async function () { }) === 'function'")

И получили эти супер крутые результаты с консоли Chrome 66:

(() => { }) instanceof Function: 1789.844970703125ms
(async () => { }) instanceof Function: 2229.64208984375ms
(function () { }) instanceof Function: 1954.09716796875ms
(async function () { }) instanceof Function: 2279.995849609375ms
typeof (() => { }) === 'function': 412.8701171875ms
typeof (async () => { }) === 'function': 413.337890625ms
typeof (function () { }) === 'function': 413.387939453125ms
typeof (async function () { }) === 'function': 412.910888671875ms

Firefox 59 занял целую вечность, чтобы запустить этот XD

У меня не было достаточно терпения, чтобы ждать этого, и я сделал РАЗ в десять раз меньше:

let TIMES = 1000 * 1000 * 10

После этого из консоли Firefox 59 я получил следующее:

(() => { }) instanceof Function: 5490ms
(async () => { }) instanceof Function: 6884ms
(function () { }) instanceof Function: 5408ms
(async function () { }) instanceof Function: 6938ms
typeof (() => { }) === 'function': 1916ms
typeof (async () => { }) === 'function': 1998ms
typeof (function () { }) === 'function': 1976ms
typeof (async function () { }) === 'function': 1972ms

Оба набора результатов показывают, что typeof намного быстрее, чем instanceof, тот факт, что пара других людей также упомянула в Что лучше всего использовать: typeof или instanceof? .

У меня вопрос "у тхо"?

1 Ответ

0 голосов
/ 03 мая 2018

Как вы и предсказывали и показывали другие ссылки из SO, typeof будет быстрее (jsperf: https://jsperf.com/instanceof-vs-typeof/5),, и это имеет смысл, потому что typeof вернет один из встроенных типов ( Object , undefined и примитивы ), пока вы управляете правой стороной операнда * 1007. * Это означает, что оператор instanceof должен проверить цепочку прототипов и посмотреть, если Правая сторона была использована в качестве конструктора где-то вдоль. Это, естественно, больше работы.

...