From ca96a728969fcbb6b8b8b3772045ea0560bd620b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D0=B7=D0=B4=D0=B0=D0=B9=D1=89=D0=B8=D0=BA?= Date: Wed, 15 Apr 2020 21:12:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=B8=C2=A0=D0=BE=D0=BF=D1=82=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20OptTree-Drive.ref?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Рефакторинг — переименование функции. • Рефакторинг — не используется замыкание для ускорения копирования. Тело функции представлено как значение, а не как замыкание, возвращающее значение. • Оптимизация — были найдены места, где значение (а) копируется, (б) сравнивается на равенство. И это малозаметные повторные переменные в присваиваниях. И эта оптимизация дала неплохие результаты. • Общее время Рефала достоверно снизилось с 64,811 с [64,628…65,168] до 54,201 с [53,894…55,031] — 16,3 %. • Время копирования контекста снизилось с 2,276 с [2,126…2,357] до 2,038 с [1,977…2,146], условно достоверно на 10 %. • Время сопоставления с повторными t-переменными вне циклов по открытым e-переменным достоверно упало с 6,180 с [6,053…6,276] почти до нуля! Из 9 замеров ненулевыми оказались только 5, четыре из них имеют значение 0,015 с, что соответствует кванту измерения времени. • Время копирования t- и e-переменных упало с 20,482 с [20,282…20,531] до 15,234 с [15,002…15,368] — достоверное ускорение на 25,6 %. Время сопоставления с повторными переменными упало на ≈6,180 с, копирования переменных — на 5,248 с. Поскольку оптимизация касается одних и тех же переменных, получается, что сопоставление с повторными переменными в актуальной реализации медленнее копирования переменных той же длины примерно на ≈15 %. Однако, время по порядку величины сравнимое. Оптимизации построения результатных выражений (в том числе, распределения памяти) посвящены задачи #196 и #247. В первой, при недостатке памяти вызывается longjmp() вместо кода возврата, во второй находятся (пока) размышления о сборке мусора. Цель обоих — ускорить выделение памяти из списка свободных узлов. Вспомнил о них, чтобы коммит привязался к заявке и можно было приложить замеры времени. Они будут приложены в #196. --- src/compiler/OptTree-Drive.ref | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/compiler/OptTree-Drive.ref b/src/compiler/OptTree-Drive.ref index 7ff3ac50..6a954f71 100644 --- a/src/compiler/OptTree-Drive.ref +++ b/src/compiler/OptTree-Drive.ref @@ -21,10 +21,8 @@ $EXTERN DisplayName; e.OptFuncNames ::= (e.Name)* e.OptFunctions ::= t.OptFunction - t.OptFunction ::= (s.Label s.ScopeClass (e.Name) s.BodyHolder) - - - == Sentences e.Sentences + t.OptFunction ::= (s.Label s.ScopeClass (e.Name) e.OptBody) + e.OptBody ::= Sentences e.Sentences */ @@ -99,7 +97,7 @@ UpdateDriveInfo { = > : e.Label + = '$' > : e.Label = >; } e.OptNames @@ -113,7 +111,7 @@ UpdateDriveInfo { = ( ( e.OptFunctions - (s.Label s.ScopeClass (e.Name) { = Sentences e.Sentences}) + (s.Label s.ScopeClass (e.Name) Sentences e.Sentences) ) ( e.RemNames @@ -155,7 +153,7 @@ DriveInlineOptimizerTick { = + == t.DriveInfo t.OptimizedFunction t.Function* Возвращает модифицированную функцию и порожденные из прогонки или встраивания */ -OptimizeF { +OptFunction { (Function s.ScopeClass (e.Name) Sentences e.Sentences) t.OptInfo s.Mode = - : (t.OptInfo (e.Sentences^) (e.NewFunctions)) + : (t.OptInfo^ (e.Sentences^) (e.NewFunctions)) = t.OptInfo (Function s.ScopeClass (e.Name) Sentences e.Sentences) e.NewFunctions; } @@ -305,7 +303,7 @@ OptSentence-Aux { e.OptFuncs /* Поиск информации для прогонки */ - = : e.OptFuncs t.FunctionForDrive + = : e.OptFuncs^ t.FunctionForDrive = : Sentences e.Sentences - = e.OptFuncs-B (s.Mode s.ScopeClass (e.LookupName) s.Body) e.OptFuncs-E + = e.Body : Sentences e.Sentences + = e.OptFuncs-B (s.Mode s.ScopeClass (e.LookupName) e.Body) e.OptFuncs-E (s.Mode s.ScopeClass (e.Name) Sentences ); }