TGViewer
melikhov.dev melikhov.dev @melikhov_dev · 4.74K subscribers
Post #201 3.91K
Ночной бред

Хотел вам показать интересный пример, что иногда
JSON.parse(JSON.stringify(obj))
работает быстрее, чем
{...obj}
. Собираем простой тест с большим циклом, загоняем полученные клоны в параметры функции и готово:

test(JSON.parse(JSON.stringify(objToCopy)))
значительно быстрее, чем
test2({...objToCopy})


Почему? кажется, что ответ на поверхности: запускаем Ноду с --allow-natives-syntax и проверяем


const a = {a: 1};
const b = {...a};
%HaveSameMap(a, b); // false

const c = JSON.parse(JSON.stringify(a));
%HaveSameMap(a, c); // true


Дело раскрыто, функция стала мегаморфной, JIT вырубился, можно писать пост.

Но! Попробуем добавить вариант с
test3(structuredClone(objToCopy))



test with JSON.parse: 268 ms.
test with structuredClone: 308 ms.
test with spread: 2802 ms.


Проверяем:


const d = structuredClone(a);
%HaveSameMap(a, d); // false


Таааак

Что же получается. И spread и structuredClone ведут к мегаморфности. Но при этом structuredClone не приводит к деоптимизациям.
Дальше докидываю
Object.assign({}, objToCopy)
и не смотря на мегаморфность


test with Object.assign: 238 ms.


Психую. Запускаю с --trace_deopt и вижу, что спред постоянно вышибает
(kind: deopt-eager, reason: wrong map)


Но почему Object.assign и structuredClone не приводят к деоптимизации? Я не знаю 🤡 и могу только предположить, что срабатывает какая-то дополнительная эвристика, и несмотря на то, что мапы разные, в деоптимизацию JIT здесь не уходит. (потому что надо спать!) А спред под такую эвристику не попадает (или, точнее, попадает через раз, так как чем больше попыток вызова, тем чаще случается деоптимизация).
  • 🔥 28
  • 🤯 10
  • 🤔 7
  • 🥴 2
  • ❤ 1
  • 👍 1
  • 😱 1
More from @melikhov_dev
  1. Sep 26, 2026Блин, ну нравятся мне TUI решения, сил нет. Просто, красиво и понятно (для меня). Продолжа…
  2. Sep 13, 2026Какой он — личный харнес? Вот мы и пришли в точку, когда уже бизнес не устраивает медленна…
  3. Aug 30, 2026Разобрал своего питонячего новостного бота и собрал нового, уже на Гермесе. Ну как собрал…
  4. Aug 24, 2026Вы могли наверное заметить что как-то мало меня стало в последнее время. Не видно на конфе…
  5. Aug 6, 2026Как же хорошо перечитывается сейчас «Трилогия Муравейника» Гибсона (она же Sprawl trilogy)…
  6. Aug 1, 2026github показал очередную полезную штуку — Stacked pull requests. Даже жалко, что как обычн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →