flang компилятор доказывает, что программа не зациклится 0.6.2 GitHub

Две правки дают 1,8 раза, и одна из них — две строки

Сделано и подтвердилось. Обе правки в дереве (ветка work/skorost, коммиты c903983 и 2854d2b). Замер после: 1,77 раза геометрическим средним, 4,50 на арифметике — предсказание сошлось почти в точку. Вклад по отдельности: флаг сборки 1,14, отметка типа ещё 1,55. Разбор — в type-inference-answers-with-a-node-mark.

Две поправки к прикидкам ниже:

Ниже — исходное разложение «что чинить первым», как оно было записано до работы.

правкаобъёмвыигрыш
флаг оптимизации -flto в порождаемом Makefile2 строки1,03–1,60×
не печатать проверку тега там, где тип уже доказан150–250 строкещё 1,09–3,15×
вместе1,8× среднее, до 4,95× на арифметике

Про вторую оценку стоит сказать отдельно. Сначала она была 60 строк. Автор поднял её до 150–250, разобравшись: проверка типов не отдаёт типы узлов вовсе. То есть сначала надо научить её это делать, и только потом можно не печатать лишнюю проверку.

Это правильное поведение: оценка, выросшая вчетверо после разбора, полезнее красивой оценки, в которую не заглядывали. Ср. a-measured-zero-is-valuable.

Что не входит в этот список и почему. Убирать счётчики шагов не надо — они внутри разброса прибора (provability-costs-2-5-percent). Сторож объявленной меры стоит дорого, но касается 66 функций из 2799.

Отдельно и крупно — память. Кубический рост (arena-never-releases) — это уже не правка, а работа, и она важнее скорости: программа, съевшая 178 ГиБ, не медленная, она просто не работает.

Связано: slower-than-python-by-1-4, provability-costs-2-5-percent, arena-never-releases