Дано:
Молотилка, реализующая схему Рунге-Кутта 4-го порядка. Ну потому что классика. Чтобы не тратиццо на оверхеды, связанные с созданием временных массивов (для K0, K1, K2, K3), создаем их перед началом интегрирования, на каждом шаге перезаписываем значения внутри. Сами данные о моделируемой системе лежат в отдельном массиве, способном удержать до 2048 элементов (каждый элемент описывается 7-ью 8-и разрядными флоатами, так что в сумме ~ 112Кб, отожранных из памяти). Используемые массивы - Float64Array, есличо
Запускаем молотилку, а чтобы было интереснее - просим ее выводить расход времени на один пробег численного интегрирования. Тестовый кейс - 28 переменных, 50000 шагов. И начинается магия (скважность на распечатке - 5000 шагов). Вот что мы словили:
![](https://diary.ru/resize/-/-/3/4/9/0/3490566/Gpcd3.png)
Первый прогон - 0.25 миллисекунды, через 10000 шагов - уже 0.0175мс, под конец - 0.0025мс. WTF!? Почему сначала мы так тормозим, а затем так лихо разгоняемся!? Есть подозрение, что Нода видит, как мы используем лишь маленький фрагмент от выделенного изначально шмата памяти и проводит подковерную оптимизацию
Upd.
Если считать по средней скорости, замерив время на старте и финише, то Нода разгоняется еще быстрее, до ~ 0.0011мс/шаг. Видимо, мы тут приблизились к пределу точности performance.now. Который для безопасности искажает выдаваемое значение. Бгыыыы