- RU.PERL ----------------------------------------------------------- RU.PERL - Msg : #1045 [644] От : Konstantin Stupnik 2:5020/400 31 октября 03, 12:02 Кому : Sergey E.Sumin 01 ноября 03, 05:31 Тема : Re: Как посимвольно обработаь строку ------------------------------------------------------------------------------- From: "Konstantin Stupnik"Hello, Sergey! SE> У меня немного другой тест и совсем другие результаты Угу, совсем другой... SE> use strict; SE> use Benchmark qw(:all) ; SE> my $a='safdsdfsdfsafdsdfsdfsafdsdfsdf'; SE> timethis(1000000,'$a =~ s/(.)/$1z/g;'); Еще бы. 1 000 000 раз применить s/// к пустой строке, много времени не надо. А вот если бы строка _там_ таки была бы не пустой, то этот весёлый циклик уже к 31-й итерации гарантированно схавал бы всю теоретически доступную на 32-битной архитектуре память :) Впрочем 64-битность не спасла бы... SE> $a='safdsdfsdfsafdsdfsdfsafdsdfsdf'; SE> my $b; SE> timethis(1000000, SE> '$b = join "",map {substr($a,$_,1)."z"} 0..length($a)-1;' SE> ); Тут тоже занимаемся работой со строкой 0-й длины. Hо хоть удваивания нет :) А вообщем, по моему тесту, этот случай в 2 раза медленнее простого for с конкатенацией. SE> undef $b; SE> timethis(1000000, SE> 'for (split(/./,$a)) { SE> $b .= $_."z"; SE> }' SE> ); SE> #print $b; И что тебе в этом месте вывелось? Мне ничего... К тому же этот код заодно выкинул бы каждый второй символ из $a, если бы $a был не пуст :) Hint: код в кавычках не может видеть lexically scoped переменных, как ни крути. В отличии от sub{} [skip "результаты"] Перепиши тест так, что б он был хоть чуть-чуть корректнее, и будет -- Best regards, Konstantin. Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5 * Origin: Talk.Mail.Ru (2:5020/400)