OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 13 Декабрь, 2019 17:13

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 25 Октябрь, 2019 03:38 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 350
Откуда: Украина, Днепропетровская обл.
Помните, я писал, что BlackBox, возможно, делает лишнюю операцию копирования при конкатенации? Так вот. Я выяснил, что он действительно присваивает строку самой себе там, где этого можно не делать, специально вызывая для этого копирования CPC486.AddCopy и CPV486.AddCopy, т.е.:
Код:
MODULE TestConcat;
VAR a: ARRAY 100 OF CHAR;
BEGIN
   a := a + "abc" (* <= Или: a := a$ + "abc", будет то же самое *)
END TestConcat.

Вот ассемблерный листинг выхода:


Вложения:
CopySelf.png
CopySelf.png [ 159.12 КБ | Просмотров: 388 ]


Последний раз редактировалось Oleg N. Cher Пятница, 25 Октябрь, 2019 03:52, всего редактировалось 2 раз(а).
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 25 Октябрь, 2019 03:45 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 350
Откуда: Украина, Днепропетровская обл.
Теперь я отвечу сам себе как ассемблерщик: а можно ли сделать оптимальнее? Однозначно, да. Раз нам нужно вычислить для конкатенации длину исходной строки, чтобы добавлять другую ей в хвост, то на процессоре x86 есть даже несколько способов сделать это оптимальнее, чем спаренное с перебросом строки в саму себя (lodsw/stosw) теперешнее решение BlackBox.

Так что я за оптимизацию, господа. А в CPfront'е и Ofront'е+ эта проблема уже решена. Кстати, привет Дмитрию Викторовичу, потому что в Мульти-Обероне ещё наверняка нет.

Есть ли желающие пободаться с Йозефом и Центром по поводу этой проблемы? Может Wening Luo (luowy) выкатит хорошее решение, у него это очень ловко получается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 25 Октябрь, 2019 08:04 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2481
Oleg N. Cher писал(а):
Кстати, обращаю внимание мэйнтейнеров собственных сборок BlackBox. Я не удивлюсь, если в них присутствует эта же проблема - копирование строки саму в себя при конкатенации. Похоже, что OMinc эту оптимизацию планировали, просто она у них не срабатывает по недосмотру: процедура OPV.SameExp (n1, n2: OPT.Node): BOOLEAN возвращает TRUE, если выражение одно и то же. Она-то и призвана отсечь копирование строки саму в себя. Но после псевдооперации преобразования типа "массив" к типу "строка" он уже не воспринимается этой процедурой как та же сущность, и она срабатывает некорректно. Правлю так:

Код:
   PROCEDURE SameExp (n1, n2: OPT.Node): BOOLEAN;
   BEGIN
+      IF (n2^.class = Nderef) & (n2^.typ^.form = String) THEN n2 := n2^.left END;
      WHILE (n1^.class = n2^.class) & (n1^.typ = n2^.typ) DO

Т.е. если последняя операция это преобразование массива к строке, то мы для сравнения её откатываем. Это работает.

Ссылка на коммит: https://github.com/Oleg-N-Cher/OfrontPl ... bf834b295d

Отпишитесь, пожалуйста, если удастся исправить это в какой-то сборке BlackBox.

Очень интересно, надо будет попробовать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 25 Октябрь, 2019 08:58 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1345
Откуда: Украина, Киев
Конкатенация строк - зло.
Для подобной функциональности лучше объект - "Построитель строки", обладающий внутренним буфером и увеличивающий его по мере необходимости.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 25 Октябрь, 2019 15:59 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 350
Откуда: Украина, Днепропетровская обл.
Ярослав Романченко писал(а):
Для подобной функциональности лучше объект - "Построитель строки", обладающий внутренним буфером и увеличивающий его по мере необходимости.
Согласен с тем, что такой функционал может быть полезен, но если его не предлагается использовать для стрельбы из пушки по воробьям (динамику там, где достаточно статики, к примеру, только для коротких строк или строк с известной максимальной длиной).

Иван Денисов писал(а):
Oleg N. Cher писал(а):
Отпишитесь, пожалуйста, если удастся исправить это в какой-то сборке BlackBox.

Очень интересно, надо будет попробовать.
Я пробовал. Нет, это не работает. В BlackBox реализация этой операции устроена по-другому.

Теперь такой вопрос ко всем. Как считаете, должен ли компилятор в случае операции присваивания строки самой себе просто не генерировать никакого кода?

Для массивов в КП есть операция a := a , которая просто копирует кусок памяти сам в себя. Для такой операции, пожалуй, можно код не генерировать.

Есть другая операция a := a$ , на первый взгляд может показаться, что для неё тоже можно не генерировать код, но у неё есть побочный эффект: трап в том случае, если в массиве не будет символа 0X.

В любом случае, проблема именно такой оптимизации стоит не столь остро. Раз программист написал a := a , то наверное он же что-то этим хотел сказать. Хотя как сказать. Но можно не писать такой код. В случае же конкатенции у нас нет выбора, и операция копирования строки саму в себя всё равно происходит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 25 Октябрь, 2019 17:36 
Аватара пользователя

Зарегистрирован: Пятница, 11 Май, 2007 21:57
Сообщения: 1345
Откуда: Украина, Киев
Oleg N. Cher писал(а):
Согласен с тем, что такой функционал может быть полезен, но если его не предлагается использовать для стрельбы из пушки по воробьям (динамику там, где достаточно статики, к примеру, только для коротких строк или строк с известной максимальной длиной).
Конечно, такой функционал оправдан, если операций конкатенации предполагается много, и длины строк большие, согласен.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 29 Октябрь, 2019 14:53 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 2481
Олег, вот тут Йозеф спрашивает, учёл ли ты вот такую ситуацию?
https://community.blackboxframework.org ... =235#p1528


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 29 Октябрь, 2019 20:17 
Аватара пользователя

Зарегистрирован: Вторник, 28 Август, 2007 00:55
Сообщения: 350
Откуда: Украина, Днепропетровская обл.
Ессно. Ответил Йозефу. Тут расписывать не буду, если где-то этот случай и будет оптимизирован, то в Центре, только потом растянут по сборкам, кто менее консервативен)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB