Вопервых причем тут генерики? вижу хэлперы.
Вовторых "кардинальные" заявления надо подкреплять компилируемым кодом а не непойми чем.
- Код: Выделить всё
uses sysutils;
var
Str : Ansistring;
l1, l2, l3, i1, i2, Len: longint;
const
count=High(i1);
begin
readln(str);
for i2 := 1 to 10 do
begin
l1 := GetTickCount;
for i1 := 1 to count do
Len := Length(Str);
L2 := GetTickCount;
for i1 := 1 to count do
Len := Str.Length;
l3 := GetTickCount;
Write('Norma=');
writeln(l2-l1);
Write('gener=');
writeln(l3-l2);
end;
readln(str);
end.
Norma=3588
gener=3620
Norma=3556
gener=3573
Norma=3557
gener=3572
Norma=3525
gener=3588
Norma=3557
gener=3588
Norma=3541
gener=3573
Norma=3557
gener=3588
Norma=3542
gener=3588
Norma=3541
gener=3588
Norma=3557
gener=3619
вполне согласуется с вызовом функции вместо инлайн вычисления
ну и так как первый вариант гораздо более "оптимизируемый" с O3 результат будет похож на ваш. Вы ведь его получили с включеной O3?
ЕМНИП хелперы только только как появились - пишем в багтрекер или поднимаем вопрос в рассылке - поправят
Добавлено спустя 44 минуты 1 секунду:вот таквот будет уже гораздо лучше:
- Код: Выделить всё
{$modeswitch typehelpers}
uses sysutils;
var
Str : Ansistring;
l1, l2, l3, i1, i2, Len: longint;
const
count=High(i1);
type
TStringHelper = type helper for ansistring
function TSHLength:Integer;inline;
end;
function TStringHelper.TSHLength: Integer;
begin
TSHLength:=Length(self);
end;
begin
readln(str);
for i2 := 1 to 10 do
begin
l1 := GetTickCount;
for i1 := 1 to count do
Len := Length(Str);
L2 := GetTickCount;
for i1 := 1 to count do
Len := Str.TSHLength;
l3 := GetTickCount;
Write('Norma=');
writeln(l2-l1);
Write('gener=');
writeln(l3-l2);
end;
readln(str);
end.