Функция upper в cutils.pas компилятора
Добавлено: 30.05.2022 10:55:56
Заглянул внутрь исходников компилятора из git и многое там поисследовал/изменил. Из всего многого пока увидел несколько однозначных моментов.
Только ли на моей машине замена функций преобразования регистра на такие работает быстрее ? Если не только можно на них заменить.
В оригинале там ряд функций в основе ктоторых лежит предзаполненный массив из которого затем выбирается готовое значение.
Для вариантов функций с одним символом выигрышен текущий вариант с предзаполенным массивом, но используются ли эти варианты функций по факту ?
Если нет можно удалить их вообще и переменные/функции предзаполнения.
Однозначнее другое: если не использовать эти функии вообще - совсем быстро. И это там тоже есть.
Несколько массивов можно заранее перевести в верхний регистр и при загрузке компилятора не переводить всякий раз.
Также было использование одного .inc файла даажды в разные пременные первую из которых можно просто удалить.
Только ли на моей машине замена функций преобразования регистра на такие работает быстрее ? Если не только можно на них заменить.
В оригинале там ряд функций в основе ктоторых лежит предзаполненный массив из которого затем выбирается готовое значение.
Для вариантов функций с одним символом выигрышен текущий вариант с предзаполенным массивом, но используются ли эти варианты функций по факту ?
Если нет можно удалить их вообще и переменные/функции предзаполнения.
Однозначнее другое: если не использовать эти функии вообще - совсем быстро. И это там тоже есть.
Несколько массивов можно заранее перевести в верхний регистр и при загрузке компилятора не переводить всякий раз.
Также было использование одного .inc файла даажды в разные пременные первую из которых можно просто удалить.
- Код: Выделить всё
function upper(const s : string) : string;
var
i : longint;
begin
upper := s;
for i:=1 to length(upper) do
if (byte(upper[i]) > 96) and (byte(upper[i]) < 123) then Dec(upper[i],32);
end;
procedure uppervar(var s : string);
var
i : longint;
begin
for i:=1 to length(s) do
if (byte(s[i]) > 96) and (byte(s[i]) < 123) then Dec(s[i],32);
end;
function lower(const s : string) : string;
var
i : longint;
begin
lower := s;
for i:=1 to length(lower) do
if (byte(lower[i]) > 64) and (byte(lower[i]) < 91) then Inc(lower[i],32);
end;