OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 18 Сентябрь, 2019 12:09

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




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Среда, 29 Ноябрь, 2017 17:43 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Товарищи, если этот вопрос ещё не обсуждался, посмотрите DevCPDump от этой процедуры в своих сборках.
Код:
(*"DevCompiler.CompileOpt('@')"*)
MODULE Mod;
   PROCEDURE UrlChar2 (ch: CHAR): BOOLEAN;
      VAR   res: BOOLEAN;
   BEGIN
      CASE ch OF
      | "a".."z", "A".."Z", "0".."9", ";", "/", "?", ":", "@", "=", "&", "$", "-", "_", ".", "+", "!", "*", "'", "(", ")", ",", '"', "#", "%":
         res := TRUE
      ELSE
         res := FALSE
      END;
      RETURN res
   END UrlChar2;
END Mod.

Код:
MODULE Mod


   PROCEDURE UrlChar2
      VAR ch: CHAR
      VAR res: BOOLEAN
   BEGIN
      CASE ch OF
      | 33..35, 36..37, 38..41, 42..44, 45..46, 47..58, 59, 61, 63..64, 65..90, 95, 97..122:
         res := TRUE;
      ELSE
         res := FALSE;
      END;
      RETURN (res);
   END UrlChar2

BEGIN
CLOSE
END Mod


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Ноябрь, 2017 18:13 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 811
Откуда: Казань
Если CASE реализуется как массив, в которых содержится адрес кода, то на производительности это не должно никак сказываться. Выборка за O(1) должна делаться.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Ноябрь, 2017 18:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Прилегающие отрезки A и B склеиваются. Результат может прилегать к следующему отрезку -- это склеивание не выполняется.
Код:
(*^Q"DevCompiler.CompileOpt('@')"*)
MODULE Mod;
   PROCEDURE Proc (ch: CHAR);
   BEGIN
      CASE ch OF
      | "A", "C", "B":
      ELSE
      END;
   END Proc;
END Mod.

MODULE Mod

   PROCEDURE Proc
      VAR ch: CHAR
   BEGIN
      CASE ch OF
      | 65..66, 67:
      END;
   END Proc

BEGIN
CLOSE
END Mod


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Ноябрь, 2017 18:16 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Rifat писал(а):
Если CASE реализуется как массив, в которых содержится адрес кода, то на производительности это не должно никак сказываться. Выборка за O(1) должна делаться.

Так делается, не во всех случаях.

Но вопрос-то в причине, а не в том, что медленно работает.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Ноябрь, 2017 18:22 

Зарегистрирован: Вторник, 26 Январь, 2010 09:31
Сообщения: 714
Откуда: Барнаул
это оптимизатор должен делать


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 29 Ноябрь, 2017 18:59 

Зарегистрирован: Пятница, 13 Март, 2009 16:36
Сообщения: 811
Откуда: Казань
Причина в том, что так не было задумано или же было задумано, но неправильно реализовано. Всё просто)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 30 Ноябрь, 2017 16:45 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4489
Откуда: Россия, Орёл
Евгений Темиргалеев писал(а):
Прилегающие отрезки A и B склеиваются. Результат может прилегать к следующему отрезку -- это склеивание не выполняется.
При добавлении нового отрезка (не пересекается с существующими) в список/дерево он объединяется с одним из имеющихся, если прилегает к нему.
[a, A - 1] -> [A, B] ---> [a, B] (1)
[B + 1, b] -> [A, B] ---> [A, b] (2)
После объединения новый отрезок может достичь соседнего с "выросшего" конца, и должен быть объединён с ним, что не выполняется. Случай (2):
[B + 1, C - 1] -> [A, B] [C, D] ---> [A, C - 1] [C, D] ---> [A, D]

Результат для процедуры UrlChar2 (строки дампа):
Код:
      CASE ch OF
      | 33..35, 36..37, 38..41, 42..44, 45..46, 47..58, 59, 61, 63..64, 65..90, 95, 97..122:

      CASE ch OF
      | 33..59, 61, 63..90, 95, 97..122:
Полное описание исправления в дельте.


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

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


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

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


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

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