тесты плохие :)
Misha v.3 14.01.2015 01:16
/ 14.01.2015 01:21
@USE
debug/Erusage.p
@main[][v]
$n(10000)
$s[/a/ab/abc/xyzw/herts/?df/11/22?333]
$r[^regex::create[(?:/[^^\?/]?)(?:\?.*)?][gn]]
^memory:compact[]
^Erusage:measure{^m1[$s]}[v]
<hr />
ms: $v.time<br />
KB: $v.memory_kb<br />
BL: $v.memory_block
@m1[s][i;j]
^for[i](1;$n){$result(^s.match[(?:/[^^\?/]?)(?:\?.*)?][gn])}
@m2[s][i;j]
^for[i](1;$n){$result(^s.match[$r])}
@m3[s][i;j;fixuri;uri]
^for[i](1;$n){$fixuri[^s.split[?;lh]]$uri[^fixuri.0.trim[both;/]]$result(^uri.split[/])}
@z[]
m1:
6
ms: 105.011
KB: 9748
BL: 10044
m2:
6
ms: 64.007
KB: 6592
BL: 6784
m3:
5
ms: 135.014
KB: 19680
BL: 20348
да, я чуть пооптимизировал regex (убрал запоминание)
если кому-то надо вызывать этот метод тысячи раз -- можно вынести создание regex-а из метода (m2), будет ещё быстрее.
в общем это не удивительно, т.к. у данных match-ей не происзодит создания объектов. у двух сплитов создаются 2 таблицы каждый раз.
P.S. методы возвращают разные результаты. зависит это от завершающего хэша. что нужно в результате я не знаю, если последний слэш не нужно учитывать, то Maxx подправит regex :)
P.P.S. но вообще этот метод по логике должен вызываться буквально пару раз. т.е. смысла в его ускорении нет ни малейшего. поэтому использовать стоит тот вариант, который проще читается. для кого-то это
match, для кого-то --
split.