Я потом подумал, что все дело просто в том, что на длинных списках процесс
"висит" на доступе к памяти. На небольших  помогает кэш. До 10000
элементов, это наверно в L2 влезает.
Потом еще был такой эффект: при повторении вызова без перезагрузки ri.exe
работа обычно замедлялась - до полутора раз. Это, видимо, объясняется
перетасовкой звеньев в памяти. В начале работы больше работаем на
последовательно расположенных звеньях -- подыгрывает кэш-линия и прочие
предсказатели.
Аркадий

чт, 28 февр. 2019 г. в 02:22, Anton Orlov orlovan_AT_gmail.com <
refal@botik.ru>:

>
>
> On Tue, Feb 26, 2019 at 6:17 AM Arkady Klimov arkady.klimov_AT_gmail.com <
> refal@botik.ru> wrote:
>
>> Юра!
>> Ты нигде не написал, какой у тебя был аргумент. 10000?
>> А ошибку я тоже у себя нашел, спасибо.
>> Арк
>>
>> PS. У себя на Рефал6 нашел странности.
>> Для начала проверил, что отождествление vA vA e транслируется также как и
>> ta eA ta eA e.
>> Это нормально. Но поиск старого терма делается без оптимизаций, на общих
>> основниях.
>> Поэтому поменял образец на sa eA sa eA e, надеясь, что будет
>> оптимизированное удлинение.
>> Не тут то было. Посмотрел компилятор - оптимизация не работает, хотя
>> присутствует, но то ли с ошибкой, то ли с сознательной блокировкой
>> (какой-то ид OVSYM вместо OSYM стоит).
>> Разблокировал. Странлировал.
>> Время работы для 10000 упало вдвое (0.54 сек). Отлично. Но дальше полезла
>> чертовщина.
>> С увеличением N время стало расти не квадратично, как раньше, а круче!
>> И для 100000 стало медленнее чем раньше (114 сек вместо 100). Это я уже
>> не понимаю.
>> Нет ли тут каких эффектов, что если мы по длинному списку бежим быстрее
>> (меньше действий), то все начинает работать медленнее? Может из-за каких-то
>> свойств кэша?
>>
>
> Это *очень* сомнительно.
>
> Не растёт ли расходуемая память при включённой оптимизации?
>
> Антон
>
> Аркадий
>>
>> вт, 26 февр. 2019 г. в 13:41, Yuri Klimov yuri_AT_klimov.net <
>> refal@botik.ru>:
>>
>>> Добрый день!
>>>
>>> Пример Аркадия на Рефал+:
>>>
>>> $func? EX sN eS = eS;
>>> EX \{
>>>   0 eS = eS;
>>>   sN eS , 'abc' : e sX e , sX eS :: eR, # \{ eR : vA vA e; }, <EX <Sub
>>> sN 1> eR>;
>>> };
>>>
>>> Я ошибся. По умолчанию в компиляторе были выключены оптимизации и
>>> включен режим отладки. Теперь время около 0.62 секунд.
>>>
>>> Пример с двумя iter из документации в приложении. Требует heap'а чуть
>>> поменьше (1ГБ против 2ГБ). Считает 10.5 секунд.
>>>
>>> Второй пример Аркадия на Рефал+ считает без heap'а за около 0.76 секунд:
>>>
>>> $func EX1 sN eS = eS;
>>> EX1 sN eS, sN eS : {
>>>   sN vA vA e = <Next sN eS>;
>>>   0 e = eS;
>>>   sN e = <EX1 <Sub sN 1> 'a' eS>;
>>> };
>>>
>>> $func Next sN eS = eS;
>>> Next {
>>>   sN = ();
>>>   sN sX eS = {
>>>     'abc' : e sX sY e = <EX1 sN sY eS>;
>>>     = <Next <Add sN 1> eS>;
>>>   };
>>> };
>>>
>>>
>>> С уважением,
>>>      Юрий Климов
>>>
>>> P.S. Во втором примере ошибка:
>>>
>>>> EX1 sN eS : {
>>>> // Goal!
>>>>    0 e = eS;
>>>> // eS is unacceptable
>>>>    sN vA vA e = <Next sN eS>; // tail recursion, eS is not empty
>>>> (otherwise previous sentence works)
>>>> ...
>>>
>>> Надо эти два случая переставить местами, а то иначе последних (самый
>>> левый в строке) символ не проверяется на повторы.
>>>
>>> On Tue, 26 Feb 2019 at 09:29, Sergei M. Abramov abram_AT_botik.ru <
>>> refal@botik.ru> wrote:
>>>
>>>> День добрый,
>>>>
>>>> > Запустил исходный пример Аркадия на Рефале+ (с компиляцией C++).
>>>> > Heap пришлось увеличить до 2GB. Время - 2.05 секунды.
>>>>
>>>> Юра, сделайте с двумя $iter-ами, пожалуйста.  Хочется и на текст
>>>> полюбоваться, и на прогон.
>>>>
>>>> Под руками системы нет, а в сухую (без воды в бассейне) и облажаться
>>>> могу...
>>>>
>>>> Всего доброго,
>>>>
>>>> Сергей Абрамов
>>>>
>>>>
>>
>>

-- 
_______________
*С уважением, *
*Аркадий Климов,*
*с.н.с. ИППМ РАН,*
*+7(499)135-32-95*
*+7(916)072-81-48*

Ответить