LINUX.ORG.RU

jacascript: split and replace


0

0

Навеяно http://www.linux.org.ru/view-message.jsp?msgid=2335615&lastmod=1197471675...

Кубик-Рубик утверждает, что split("$").join(":") быстрее чем replace("$",":",'g')

В обоснование он говорит, что replace работает с регекспом, а split со строкой, однако еще в перле split работал с регекспом.

В подтверждение он говорит что в большинстве книг и документаций сказано что replace поддерживает только регексп, однако в ECMA-262 сказано, что там может быть строка.

Также если бы "$" было регекспом, то ничего бы не сработало - ведь регексп /$/ не имеет смысла, т.к. $ в регекспах это конец строки, хотя видимо он не знает, что в javascript регулярное выражение обрамляется символом /.

Скажите, прав ли он? Или он сливает?

PS. split("$").join(":") - из исходников ASP.NET 1.1

anonymous

> ведь регексп /$/ не имеет смысла

почему не имеет? этот регексп находит конец строки

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

>почему не имеет? этот регексп находит конец строки

В том смысле что для сплита - смысла не имеет. Ну а что он еще даст? Если только multiline. Именно регексп /$/ не нужен.

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

>Деточка, вы форумом не промахнулись?

А куда надо было? Язык javascript не только в Web Dev используется.

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

Да, единственное в чем я был неправ - что глобальный регексп по строке возможен только в Gecko, но в большинстве случаев регексп даже быстрее обычного реплейса со строками.

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

>но в большинстве случаев регексп даже быстрее обычного реплейса со строками.

Прикол (и возьмите на заметку кому надо). Вырезать первых N символов через регексп в PHP почти вчетверо быстрее, чем через substr:

preg_match: time=0.662420034409
substr    : time=2.32989287376

<?php

function r1($str)
{
    for($i = 0; $i<1000000; $i++)
        substr($str, 0, 10);
}

function r2($str)
{
    for($i = 0; $i<1000000; $i++)
    {
        preg_match('!^(.{10})!', $str, $m);
        $m[1];
    }
}

function timing($str="")
{
    static $start = NULL;
    
    if($start)
        echo "$str: time=".(microtime(true) - $start)."\n";

    $start = microtime(true);
}

$str = '$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d';
timing();
r1($str); timing("preg_match");
r2($str); timing("substr    ");

...

Я такими заменами Smarty почти в пять раз ускорил.

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

>preg_match: time=0.662420034409
>substr    : time=2.32989287376

В Питоне. Интересно, почему такие медленные регекспы?

re.match: time=5.920000
slice   : time=0.290000

#!/bin/python 

import re, time

str = "$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d$a$b$c$d";

def r1(str):
    for i in xrange(1000000):
        g = re.match(r'^(.{10})', str)
        g.group(1)

def r2(str):
    for i in xrange(1000000):
        str[0:10]

start = False

def timing(str):
    global start

    if(start):
        print "%s: time=%f" % (str, time.clock() - start)

    start = time.clock()

timing("")

r1(str)
timing("re.match")

r2(str)
timing("slice   ")


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

В руби все одинаково медленно, но регекспы рулят.

split 27.51
gsub/string 23.88
gsub/regexp 22.46

насчет PHP, спасибо, возьму на заметку. Может это потому что pcre на си написано, и годами отлаживалась и ускорялась, а реплейс по строкам написан не оптимально, в худшем случае вообще циклом на самом php.

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

Кстати, $string{n} - это по сути другая запись того же substr. Так что $str{0} == '/' будет намного медленнее, чем if(preg_match('!^/!', $str)).

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