Skip to content

Commit

Permalink
Микрооптимизация R5-Lexer.ref + таблица частот лексем
Browse files Browse the repository at this point in the history
Оптимизация была сделана с учётом частоты встречаемости различных лексем.
Вот эта таблица:

    79019 пробелы
    22420 конец строки
    15199 переменные
     7789 идентификаторы
     6347 TkOpenBracket
     6347 TkCloseBracket
     5397 TkSemicolon
     4499 * комментарий
     3314 TkAssign
     2796 TkCloseCall
     2683 <Ident
     2541 $КЛЮЧЕВОЕСЛОВО
     1806 '...'
     1014 TkOpenBlock
     1014 TkCloseBlock
      696 /* ... */
      652 TkComma
      557 TkColon
      398 Digit
      265 TkRedefinition
      248 "..."
      123 TkAmpersand
      104 [Ident
      104 TkCloseADT
       99 <var
       37 $EXTENDED
       13 <+, <*, ...
        1 <...

Эта таблица получена для исходников компилятора Рефала-5λ, бо́льшая часть
которых ранее была Простым Рефалом (так что может быть не репрезентативна).

Оптимизация заключалась в простом переупорядочивании предложений функции
DoScan и подобным оптимизациям в других функциях. И действительно она
оказалась микрооптимизацией.

Измерения делались на машине Intel® Core™ i5-2430M CPU @ 2.40GHz с 8 Гбайтами
ОЗУ, ОС Windows 10. Было выполнено по 13 измерений текущего коммита
и родительского стандартным бенчмарком.

Программа ускорилась на 0,63 %, с 21,640 (21,475…21,772) до 21,503
(21,393…21,561). Результат статистически недостоверен, доверительные интервалы
перекрываются сильно. Но делать большее число замеров очень долго, один
проход бенчмарка занимает около 10 минут.

Статистически достоверным оказывается ускорение линейного времени сопоставления
с образцом — на 5,3 % с 7,789 (7,545…8,003) до 7,393 (7,277…7,626). Впрочем,
именно это и оптимизировалось. Также уменьшилось число шагов рефал-машины,
с 20691929 до 20421909, на 1,3 %.

Коммит интересен таблицей, которая находится в его сообщении. Возможно, она
пригодится для дальнейшей оптимизации лексера.
  • Loading branch information
Mazdaywik committed Feb 27, 2019
1 parent 73ca255 commit 2fa8dd6
Showing 1 changed file with 48 additions and 48 deletions.
96 changes: 48 additions & 48 deletions src/compiler/R5-Lexer.ref
Original file line number Diff line number Diff line change
Expand Up @@ -95,46 +95,16 @@ IncCol {
DoScan {
t.Pos = (TkEOF t.Pos);

t.Pos () e.Lines = <DoScan <IncLine t.Pos> e.Lines>;

t.Pos (' ' e.Line) e.Lines = <DoScan <IncCol t.Pos> (e.Line) e.Lines>;
t.Pos ('\t' e.Line) e.Lines = <DoScan <IncCol t.Pos> (e.Line) e.Lines>;
t.Pos ('\r' e.Line) e.Lines = <DoScan <IncCol t.Pos> (e.Line) e.Lines>;

t.Pos ('$' e.Line) e.Lines = <DoScan-Keyword t.Pos (e.Line) e.Lines>;

t.Pos (s.Digit e.Line) e.Lines
, <Type s.Digit> : 'D0' s.Digit
= <DoScan-Number t.Pos (s.Digit) (e.Line) e.Lines>;
t.Pos () e.Lines = <DoScan <IncLine t.Pos> e.Lines>;

t.Pos (s.Var '.' e.Line) e.Lines
, <IsVarType s.Var> : True
= <DoScan-Var t.Pos (s.Var '.') (e.Line) e.Lines>;

t.Pos ('/*' e.Line) e.Lines = <DoScan-CComment t.Pos ('/*') (e.Line) e.Lines>;

(RowCol s.Line 1) ('*$CLASSIC') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Classic)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*$EXTENDED') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Extended)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*$CLASSIC;') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Classic)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*$EXTENDED;') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Extended)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*' e.Comment) e.Lines
= <DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('%%') e.Lines
= <DoScan-NativeCode (RowCol <Inc s.Line> 1) e.Lines>;

t.Pos (s.StartIdent e.Line) e.Lines
, <IsStartIdent s.StartIdent> : True
= <DoScan-Ident t.Pos (s.StartIdent) (e.Line) e.Lines>;
Expand All @@ -144,6 +114,9 @@ DoScan {
= (s.TokType t.Pos)
<DoScan <IncCol t.Pos> (e.Line) e.Lines>;

(RowCol s.Line 1) ('*' e.Comment) e.Lines
= <DoScan (RowCol <Inc s.Line> 1) e.Lines>;

/*
Предложение не избыточно, поскольку иначе в вызове <s.F …> «s» будет
восприниматься как идентификатор, а точка за ним вызовет ошибку.
Expand All @@ -157,15 +130,15 @@ DoScan {
, <IsStartIdent s.StartIdent> : True
= <DoScan-Ident t.Pos ('<' s.StartIdent) (e.Line) e.Lines>;

t.Pos ('<' s.SugarName e.Line) e.Lines
, ('+Add') ('-Sub') ('*Mul') ('/Div') ('%Mod') ('?Residue')
: e.SugarNames-B (s.SugarName e.RealName) e.SugarNames-E
= (TkOpenCall t.Pos e.RealName)
<DoScan <IncCol t.Pos Len '<' s.SugarName> (e.Line) e.Lines>;
t.Pos ('$' e.Line) e.Lines = <DoScan-Keyword t.Pos (e.Line) e.Lines>;

t.Pos ('<' e.Line) e.Lines
= (TkOpenCall t.Pos /* empty */)
<DoScan <IncCol t.Pos> (e.Line) e.Lines>;
t.Pos ('\'' e.Line) e.Lines
= <DoScan-Chars <IncCol t.Pos> (e.Line) e.Lines>;

t.Pos ('/*' e.Line) e.Lines = <DoScan-CComment t.Pos ('/*') (e.Line) e.Lines>;

t.Pos ('\"' e.Line) e.Lines
= <DoScan-Compound t.Pos <IncCol t.Pos> () (e.Line) e.Lines>;

t.Pos ('[' s.StartIdent e.Line) e.Lines
, <Type s.StartIdent> : 'L' s.Case s.StartIdent
Expand All @@ -176,11 +149,38 @@ DoScan {
(TkError t.Pos 'Expected function name after \'[\'')
<DoScan <IncCol t.Pos> (e.Line) e.Lines>;

t.Pos ('\'' e.Line) e.Lines
= <DoScan-Chars <IncCol t.Pos> (e.Line) e.Lines>;
t.Pos (s.Digit e.Line) e.Lines
, <Type s.Digit> : 'D0' s.Digit
= <DoScan-Number t.Pos (s.Digit) (e.Line) e.Lines>;

t.Pos ('\"' e.Line) e.Lines
= <DoScan-Compound t.Pos <IncCol t.Pos> () (e.Line) e.Lines>;
(RowCol s.Line 1) ('*$CLASSIC') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Classic)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*$EXTENDED') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Extended)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*$CLASSIC;') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Classic)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('*$EXTENDED;') e.Lines
= (TkRefal5Mode (RowCol s.Line 1) Extended)
<DoScan (RowCol <Inc s.Line> 1) e.Lines>;

(RowCol s.Line 1) ('%%') e.Lines
= <DoScan-NativeCode (RowCol <Inc s.Line> 1) e.Lines>;

t.Pos ('<' s.SugarName e.Line) e.Lines
, ('+Add') ('-Sub') ('*Mul') ('/Div') ('%Mod') ('?Residue')
: e.SugarNames-B (s.SugarName e.RealName) e.SugarNames-E
= (TkOpenCall t.Pos e.RealName)
<DoScan <IncCol t.Pos Len '<' s.SugarName> (e.Line) e.Lines>;

t.Pos ('<' e.Line) e.Lines
= (TkOpenCall t.Pos /* empty */)
<DoScan <IncCol t.Pos> (e.Line) e.Lines>;

t.Pos ('\\' e.LineWithEscapes) e.Lines
, <ScanEscape t.Pos e.LineWithEscapes>
Expand All @@ -205,10 +205,10 @@ IsVarType {
IsPunctuation {
s.Punct
, ('(' TkOpenBracket) (')' TkCloseBracket)
(';' TkSemicolon) ('=' TkAssign) ('>' TkCloseCall)
('{' TkOpenBlock) ('}' TkCloseBlock)
('>' TkCloseCall) (']' TkCloseADT)
('&' TkAmpersand) ('^' TkRedefinition)
(',' TkComma) (':' TkColon) ('=' TkAssign) (';' TkSemicolon)
(',' TkComma) (':' TkColon) ('^' TkRedefinition)
(']' TkCloseADT) ('&' TkAmpersand)
: e.Types-B (s.Punct s.TokType) e.Types-E
= s.TokType;

Expand Down Expand Up @@ -293,8 +293,8 @@ IsIdentTail {
s.Other
, <Type s.Other>
: {
'D0' s.Other = True;
'L' s.Case s.Other = True;
'D0' s.Other^ = True;
'L' s.Case s.Other^ = True;

e.OtherType = False;
}
Expand Down

0 comments on commit 2fa8dd6

Please sign in to comment.