О простейших дженериках в FPC...

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

О простейших дженериках в FPC...

Сообщение beria » 19.01.2017 00:20:43

Накарябанный на скорую руку код

Код: Выделить всё
var
Str : Ansistring;
l1, l2, l3, i1, i2: longint;
begin
readln(str);
for i2 := 1 to 10 do
  begin
    l1 := GetTick;
    for i1 := 1 to High(i1) do
      Len := Length(Str);
    L2    := GetTick;
    for i1 := 1 to High(i1) do
      Len := Str.Length;
    l3    := Gettick;
    Write('Norma=');
    writeln(TickDelta(l1, l2));
    Write('gener=');
    writeln(TickDelta(l2, l3));
  end;     


Выдает во время прогона на стареньком компьютере
Код: Выделить всё
Norma=841
gener=2173
Norma=830
gener=2186
Norma=812
gener=2197
Norma=838
gener=2203
Norma=822
gener=2167
Norma=815
gener=2166
Norma=811
gener=2169
Norma=811
gener=2184
Norma=816
gener=2186
Norma=815
gener=2188



Что нам говорит, что реализация дженериков для, как минимум строк, совершенно кривая с точки зрения производительности. Я прав?
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О простейших дженериках в FPC...

Сообщение zub » 19.01.2017 01:00:49

нет не прав. Хотябы в том что для теста привел какойто огрызок, а не полноценный компилируемый код
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: О простейших дженериках в FPC...

Сообщение beria » 19.01.2017 01:43:27

zub писал(а):нет не прав.

тогда расскажите как надо правильно сравнивать производительность двух реализаций одной и той-же операции, кроме как сравнивать время в "тиках" на их выполнение?
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О простейших дженериках в FPC...

Сообщение zub » 19.01.2017 07:44:48

Вопервых причем тут генерики? вижу хэлперы.
Вовторых "кардинальные" заявления надо подкреплять компилируемым кодом а не непойми чем.
Код: Выделить всё
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.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: О простейших дженериках в FPC...

Сообщение beria » 19.01.2017 12:26:38

zub писал(а): Вы ведь его получили с включеной O3?

естественно. Как бы ИМХО без оптимизации смысл есть только для отладки, а не для готовой программы, так что я бы выражение "оптимизация кода компилятором" в кавычки бы не ставил .... )))))
Так что все же мой вывод о кривой реализации подтверждается натурным экспериментом на нескольких машинах и под разными операционными системами. Подправят - не подправят, но смысл в том, в данный момент вполне реально переписал первый вариант реализации (хотя более красивый) на простой вызов нативных строчных функций я получил прибавку в производительности более чем в два раза... и без всякого изменения логики, что неплохо для самописного парсера, завязанного именно на строки...
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О простейших дженериках в FPC...

Сообщение zub » 19.01.2017 12:46:28

>>переписал первый вариант реализации (хотя более красивый) на простой вызов нативных строчных функций я получил прибавку в производительности более чем в два раза
Более красивый vs простой и нативный... - всё логично. Первый вариант был выбран изза красоты или объективно?
Откажитесь от стрингов вообще, думаю производительность возрастет кардинально. Если это настолько критично.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: О простейших дженериках в FPC...

Сообщение beria » 19.01.2017 13:06:00

zub писал(а):Первый вариант был выбран изза красоты или объективно?


Красота. Раскрыл первый вариант кода и получил громадное дерево if then else и кучу циклов с досрочным выходом.. Хотя реально те методы статического объекта что уже переписал за ночь работают в среднем в 2 раза быстрее и это меня радует.
zub писал(а): Если это настолько критично.

Конечно критично. Клиент для сервера.
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О простейших дженериках в FPC...

Сообщение zub » 19.01.2017 21:54:20

Красота фичи которая в данном месте ненужна очень сомнительна - хэлпер это вызов функции
Заверните Len := Length(Str); в функцию и сравните, результаты результаты будут аналогичны.

>>в среднем в 2 раза быстрее и это меня радует.
Если не секрет что за алгоритм такой настолько чувствительный к вычислению длины стринга? он получается ничего более полезного-тяжелого не делает, только стринги мереет?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: О простейших дженериках в FPC...

Сообщение beria » 20.01.2017 02:31:54

zub писал(а):только стринги мереет?


Дело не не в Length, а вообще в строчных операциях. Length просто как в пример наиболее простой и элементарной операции, чтобы исключить все другие связи и рассматривать производительность исключительно самого вызова...
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О простейших дженериках в FPC...

Сообщение zub » 20.01.2017 02:38:21

В приведенном примере производительность строк никак не отражена - вызов функции vs инлайн вычисление - то что это хелпер для строк просто совпадение
Да, строки медленные - неявные выделения памяти, а теперь еще возможно неявные перекодировки.
Но если выделения минимизировать переработав алгоритмы, то вполне можно жить. В особо критичных случаях отказаться от строк
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: О простейших дженериках в FPC...

Сообщение beria » 20.01.2017 03:03:28

zub писал(а):а теперь еще возможно неявные перекодировки.


У меня в объекте каждая процедура есть с одним именем и в двух вариантах с разными форматами строк. Тут померил неявные перекодировки видестринг-ансистринг-уникодестринг и ужаснулся. Теперь в зависимости от аргументов компилятор сам берет нужную процедуру и производительность меня радует куда больше...
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О простейших дженериках в FPC...

Сообщение bormant » 20.01.2017 10:20:24

Касательно перекодировок: теперь добавился шанс нарваться и на автоконвертацию кодовых страниц.
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru