Я потом подумал, что все дело просто в том, что на длинных списках процесс "висит" на доступе к памяти. На небольших помогает кэш. До 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*