Вопрос даже шире, чем я думал.
Вот объявление модуля Strings:
## Код:
```
DEFINITION Strings;

   CONST
      charCode = -1; decimal = 10; hexadecimal = -2; roman = -3;
      digitspace = 8FX;
      hideBase = FALSE; showBase = TRUE;

   PROCEDURE Valid (IN s: ARRAY OF CHAR): BOOLEAN;
   PROCEDURE Extract (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR);
   PROCEDURE Find (IN s: ARRAY OF CHAR; IN pat: ARRAY OF CHAR; start: INTEGER;
                           OUT pos: INTEGER);
   PROCEDURE Replace (VAR s: ARRAY OF CHAR; pos, len: INTEGER; IN rep: ARRAY OF CHAR);
   PROCEDURE Lower (ch: CHAR): CHAR;
   PROCEDURE Upper (ch: CHAR): CHAR;
   PROCEDURE ToLower (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);
   PROCEDURE ToUpper (in: ARRAY OF CHAR; OUT out: ARRAY OF CHAR);

   PROCEDURE IntToString (x: LONGINT; OUT s: ARRAY OF CHAR);
   PROCEDURE IntToStringForm (x: LONGINT; form, minWidth: INTEGER; fillCh: CHAR;
                                       showBase: BOOLEAN; OUT s: ARRAY OF CHAR);
   PROCEDURE RealToString (x: REAL; OUT s: ARRAY OF CHAR);
   PROCEDURE RealToStringForm (x: REAL; precision, minW, expW: INTEGER; fillCh: CHAR;
                                             OUT s: ARRAY OF CHAR);
   PROCEDURE StringToInt (IN s: ARRAY OF CHAR; OUT x, res: INTEGER);
   PROCEDURE StringToLInt (IN s: ARRAY OF CHAR; OUT x: LONGINT; res: INTEGER);
   PROCEDURE StringToReal (IN s: ARRAY OF CHAR; OUT x: REAL; OUT res: INTEGER);

END Strings.
```


Рассмотрим процедуру PROCEDURE Extract (s: ARRAY OF CHAR; pos, len: INTEGER; OUT res: ARRAY OF CHAR);

Первый параметр входит по значению, а результат выходит по ссылке.
При этом первый параметр используется только для чтения, а внутри процедуры происходит копирование элементов с pos по min(pos+len, размер(s)).
Выходит, что первый параметр был зря передан по значению, можно было бы его передавать по ссылке и ускорить работу функции Extract.

Ах, нашел ответ в описании самого модуля:
> -- Цитата:
> The library is optimized for convenience, not for efficiency.