LINUX.ORG.RU

Потестите авторы на тикле и на других языках


0

0

Здравствуйте.

Суть такова. Хочу в тикле с помощью regexp заменить string range
 таким образом:

Если "string range строка первый второй"

То "regexp {^.{первый}(.{второй-первый})} строка - подстрока"

(Если кто не знает тикль - string range выдаёт подстроку от первого индекса до второго.)

"первый" и "второй" - номера индексов, второй-первый - их разность. 
 В "подстрока" должна быть строка от первого индекса до второго.



Всё работает, за исключением того, что "первый" и "второй" должен
 быть меньше 256, и того, что время исполнения regexp много больше,
 чем string range, хотя особо сложного ничего не сравнивается. Первую
 проблему удаётся решить через костыли - {.{одначасть}.{втораячасть}
  и т. д. }, т. е. разбиением числа на сумму, а вот вторую никак.

У меня Tcl 8.5.3, Debian.

Просьба такая - потестите, плиз, на своих любимых языках, если в них
 есть регулярки и функции вычисления времени выполнения, и в своих
 версиях тикля данную конструкцию. Точные данные выбирайте сами, меня
 просто интересует относительный рост времени исполнения. Я брал
 строки от десятков до тысяч символов, и пытался выделить где-то
 20-80 % строки. Опять же, точное время не интересует - нужен
 порядок. У меня (строка в q)

200 символов time {regexp  {.{20}(.{150})} $q a b}  2226 microseconds
1000 time {regexp  {.{255}(.{150})} $q a b}  7961 microseconds
1000 time {regexp  {.{255}.{255}(.{150})} $q a b}   20269 microseconds
2000 time {regexp  {.{255}.{255}(.{150})} $q a b}  16290 microseconds
2000 time {regexp  {.{255}.{255}.{255}.{255}.{255}(.{150})} $q a b} 98682 microseconds


То есть видно, что чем больше нужно пропустить изначально, тем
 сильнее растёт время. Причём растёт оно очень сильно.

anonymous

Да, на других языках интересует наличие ограничения пропуска более 255 символов. Т.е. можно ли написать .{500} , .{67000} и т. д.

anonymous
()

>>Всё работает, за исключением того, что "первый" и "второй" должен быть меньше 256

Кому, интересно, они должны?

anonymous
()

Заархивируй получше свой примерный файл метров на 10 и закинь куда-нить типа www.rapidspread.com И опиши попроще, что хочешь из него выделить

anonymous
()
Ответ на: комментарий от anonymous

Еще раз повторяю - в строке от десятка до тысяч символов вытягиваем подстроку от первого до второго символа методами regexp. Никаких примерных файлов нет - просто случайная строка из букс без пробелов. Типа такой : lkdgsdsdfbkhhjfgsdkghwerutyseiurtysidourtysiubd

anonymous
()
Ответ на: комментарий от anonymous

Хм. C/pcre, файл 10000 символов, выражение "(.{255})(.{255})", ~100μs. Tcl 8.4.3 говорит ~20000 microseconds per iteration.

У pcre ограничение 65536; на том же файле "(.{9000})(.{255})" занимает ~200μs.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.