Skip to content

Commit

Permalink
Рефакторинг и оптимизация OptTree-Drive.ref
Browse files Browse the repository at this point in the history
• Рефакторинг — переименование функции.
• Рефакторинг — не используется замыкание для ускорения копирования.
  Тело функции представлено как значение, а не как замыкание,
  возвращающее значение.
• Оптимизация — были найдены места, где значение (а) копируется,
  (б) сравнивается на равенство. И это малозаметные повторные
  переменные в присваиваниях.

И эта оптимизация дала неплохие результаты.

• Общее время Рефала достоверно снизилось с 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.
  • Loading branch information
Mazdaywik committed Apr 15, 2020
1 parent c896b8d commit ca96a72
Showing 1 changed file with 12 additions and 14 deletions.
26 changes: 12 additions & 14 deletions src/compiler/OptTree-Drive.ref
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ $EXTERN DisplayName;
e.OptFuncNames ::= (e.Name)*
e.OptFunctions ::= t.OptFunction

t.OptFunction ::= (s.Label s.ScopeClass (e.Name) s.BodyHolder)

<s.BodyHolder>
== Sentences e.Sentences
t.OptFunction ::= (s.Label s.ScopeClass (e.Name) e.OptBody)
e.OptBody ::= Sentences e.Sentences
*/


Expand Down Expand Up @@ -99,7 +97,7 @@ UpdateDriveInfo {
= <Map
{
(s.Label e.Name)
= <Lower <Explode s.Label>> : e.Label
= '$' <Upper <Explode s.Label>> : e.Label
= <Log-PutLine 'New ' e.Label ' function: ' <DisplayName e.Name>>;
}
e.OptNames
Expand All @@ -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
Expand Down Expand Up @@ -155,7 +153,7 @@ DriveInlineOptimizerTick {
= <MapAccum
{
t.OptInfo^ (Function s.ScopeClass (e.Name) Sentences e.Sentences)
= <OptimizeF
= <OptFunction
(Function s.ScopeClass (e.Name) Sentences e.Sentences)
t.OptInfo
s.Mode
Expand Down Expand Up @@ -251,14 +249,14 @@ IsLexpr-Aux {

/*
Осуществляет попытку прогонки или встраивания в функции
<OptimizeF t.Function t.DriveInfo s.Mode>
<OptFunction t.Function t.DriveInfo s.Mode>
== t.DriveInfo t.OptimizedFunction t.Function*

Возвращает модифицированную функцию
и порожденные из прогонки или встраивания
*/

OptimizeF {
OptFunction {
(Function s.ScopeClass (e.Name) Sentences e.Sentences)
t.OptInfo s.Mode
= <Reduce
Expand All @@ -271,7 +269,7 @@ OptimizeF {
(t.OptInfo (/*sentences*/) (/*functions*/))
e.Sentences
>
: (t.OptInfo (e.Sentences^) (e.NewFunctions))
: (t.OptInfo^ (e.Sentences^) (e.NewFunctions))
= t.OptInfo
(Function s.ScopeClass (e.Name) Sentences e.Sentences) e.NewFunctions;
}
Expand Down Expand Up @@ -305,7 +303,7 @@ OptSentence-Aux {
e.OptFuncs

/* Поиск информации для прогонки */
= <FindOptInfo e.OptFuncs (e.Name)> : e.OptFuncs t.FunctionForDrive
= <FindOptInfo e.OptFuncs (e.Name)> : e.OptFuncs^ t.FunctionForDrive

= <OptSentence-MakeSubstitutions
s.Mode ((e.Left) (e.Right)) (e.Args) t.FunctionForDrive
Expand Down Expand Up @@ -455,10 +453,10 @@ FindOptInfo {
}

FindOptInfo-Aux {
e.OptFuncs-B (s.Mode s.ScopeClass (e.LookupName) s.Body) e.OptFuncs-E
e.OptFuncs-B (s.Mode s.ScopeClass (e.LookupName) e.Body) e.OptFuncs-E
(e.Name) (e.LookupName) s.Drop
= <s.Body> : 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 <DropLeft e.Sentences s.Drop>);
}

Expand Down

0 comments on commit ca96a72

Please sign in to comment.