Дано:
Молотилка, реализующая схему Рунге-Кутта 4-го порядка. Ну потому что классика. Чтобы не тратиццо на оверхеды, связанные с созданием временных массивов (для K0, K1, K2, K3), создаем их перед началом интегрирования, на каждом шаге перезаписываем значения внутри. Сами данные о моделируемой системе лежат в отдельном массиве, способном удержать до 2048 элементов (каждый элемент описывается 7-ью 8-и разрядными флоатами, так что в сумме ~ 112Кб, отожранных из памяти). Используемые массивы - Float64Array, есличо
Запускаем молотилку, а чтобы было интереснее - просим ее выводить расход времени на один пробег численного интегрирования. Тестовый кейс - 28 переменных, 50000 шагов. И начинается магия (скважность на распечатке - 5000 шагов). Вот что мы словили:

Первый прогон - 0.25 миллисекунды, через 10000 шагов - уже 0.0175мс, под конец - 0.0025мс. WTF!? Почему сначала мы так тормозим, а затем так лихо разгоняемся!? Есть подозрение, что Нода видит, как мы используем лишь маленький фрагмент от выделенного изначально шмата памяти и проводит подковерную оптимизацию
Upd.
Если считать по средней скорости, замерив время на старте и финише, то Нода разгоняется еще быстрее, до ~ 0.0011мс/шаг. Видимо, мы тут приблизились к пределу точности performance.now. Который для безопасности искажает выдаваемое значение. Бгыыыы
И поскольку динамически размер таких массивов изменить нельзя, то вероятно, что хитрый V8 может засунуть не очень крупный типированный массив напрямую в кэш камня. Но тут надо погружаться в самые пучины документации на сам интерпретатор
Единственное, что реально и ощутимо бесит - невозможность прямого управления кучей: отсутствие явных деструкторов и "своенравное" поведение GarbageCollector-а.