Новые замеры.
Численное интегрирование 360 секунд эволюции системы уравнений химической кинетики (взаимодействие цепочек РНК), состоящей из 19 уравнений. Правые части квадратичны по переменным. Решение проводится явным методом Рунге-Кутты 45 с адаптивным шагом (производится согласованный расчёт методом 4го и 5го порядка, и из их разницы получается оценка на ошибку). Особая сложность состоит в том, что в одном из режимов (with heating) происходит кратковременная (меньше 10 секунд) смена температуры, переводящая систему в сильно жёсткий режим.
Алгоритмы либо одинаковы (обероновские версии с моей собственной реализацией РК45), либо являются почти дословным переводом обероновских версий с использованием специализированных библиотек для численного интегрирования. Все параметры, включая ограничения по абсолютной и относительной ошибкам, одинаковы для всех реализаций. Простая питоновская реализация использует метод RK45 из scipy.integrate в цикле. Рализация через solve_ivp использует у себя внутри тот же самый метод RK45, но уже без моего цикла. Реализации в Джулии DP5 и Tsit5 — это, как я понял, просто два разных варианта метода РК45 (разные выборы коэффициентов для промежуточных шагов). При этом при переходе в режим жёсткой системы Джулия ругается и предлагает использовать неявные методы. Реализация через AutoTsit5(Rosenbrock23()) как раз это и делает: она использует неявный метод РК45 до тех пор, пока не зафиксирует высокую степень жёсткости системы, после чего переключается на метод Розенброка (один из неявных методов Рунге-Кутты), и наоборот.
ББ и A2 работали с полным GUIем. Всё запускалось на Arch Linux 64x на одном ядре процессора (там, где это от меня зависело, но у меня их в любом случае только два на этой машине). При компиляции Офронт+ом не были выключены ни проверки (вывозил за диапазон и т. п.) ни сборщик мусора, дальнейшее компилирование в машинный код проводились при помощи gcc с флагом оптимизации -Os.
Вот результаты замеров:
Код:
360 s with heating:
Ofront+ 00m31.743s
BlackBox 01m01.397s
A2 02m52.718s
Python 62m00.986s
Julia,DP5 00m50.533s
Julia,Tsit5 00m49.785s
Julia,
AutoTsit5(Rosenbrock23()) 00m16.106s
360 s without heating:
Ofront+ 00m01.366s
BlackBox 00m02.923s
A2 00m06.431s
Python 02m28.379s
Python,solve_ivp 02m27.186s
Julia,DP5 00m17.944s
Julia,Tsit5 00m16.917s
Julia,
AutoTsit5(Rosenbrock23()) 00m16.098s
Что можно сказать? Офронт — чемпион. ББ неожиданно (для меня) держится неплохо, всего вдвое уступая по скорости. A2 заметно тормознее и уступает Офронту в 5–6 раз. Джулия на том же алгоритме ведёт себя на уровне ББ на сложной задаче, очень сильно теряя в производительности на простой (скорость хуже, чем у A2). На более оптимальном алгоритме Джулия показывает лучший результат в случае жёсткой системы, тогда как результат посредственный в простом случае. Более того, видно, что переключение на неявную схему позволяет легко преодолеть этот жёсткий участок, а основное время выполнения при этом набирается на простом участке (времена выполнения почти одинаковы без и с нагреванием). Про Питон помолчим. Грешно смеяться над больными языками.
Ещё замечу, что за время подготовки этих тестов A2 однажды намертво подвесила мою систему при перетаскивании мыши. ББ демонстрировал тормозючесть при промотке больших документов вверх (например, в отчёте по языку КП), а некоторые порты (окошки) изредка (пару раз было) переставали отвечать и закрашивались толстой полупрозрачной штриховокой.
Всем этим тестам я обязан настойчивым просьбам начальства переписать свои программы с Оберона на что-нибудь другое.