22:34

Ваша Всратость
Нода вознамерилась-таки пожрать мой моск.
Дано:

Молотилка, реализующая схему Рунге-Кутта 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. Который для безопасности искажает выдаваемое значение. Бгыыыы

@музыка: Почему молчит коммуникатор - ритуальная композиция

@темы: кодерастия, ступор мозговины

Комментарии
26.11.2022 в 13:00

у проца кэш есть - отсюда и разгон. да и ты наверн на яве пишешь?
26.11.2022 в 13:16

Ваша Всратость
2john_d0e, Нет, это Node JS. Прямой низкоуровневой оптимизации вроде сяшных регистровых переменных в нем нет, но "новые" (с ES6) байтовые массивы и связанные с ними отображения позволяют работать напрямую с данными в нативном представлении.

Native APIs often receive and return data in a binary format, which you could neither store nor manipulate well in pre-ES6 Javasсript.


И поскольку динамически размер таких массивов изменить нельзя, то вероятно, что хитрый V8 может засунуть не очень крупный типированный массив напрямую в кэш камня. Но тут надо погружаться в самые пучины документации на сам интерпретатор
26.11.2022 в 18:45

2не3доровые_асс0циацыи, ты полностью. единственный нюанс в том что любые подходящие инструкции проца могут кэшироваться (в теории все, конечно).
26.11.2022 в 20:07

Ваша Всратость
2john_d0e, JS с точки зрения оптимизации построен достаточно грамотно. Вроде "скрытых классов", которые под капотом применяются, например, в нативных "обычных" массивах.

Единственное, что реально и ощутимо бесит - невозможность прямого управления кучей: отсутствие явных деструкторов и "своенравное" поведение GarbageCollector-а.

Расширенная форма

Редактировать

Подписаться на новые комментарии