Size: a a a

2021 January 28

AG

Anatolia Gr in Modern::Perl
Sergey Zhmylove
Второе место это не так важно при такой разнице
От данных сильно зависит и tr не универсальное решение
источник

DF

Denis F in Modern::Perl
m тащит :)
perl ./t.pl 
                  Rate while_dollar      while_n           tr            m
while_dollar     5.38/s           --         -65%         -97%        -100%
while_n          15.2/s         183%           --         -91%        -100%
tr                168/s        3013%        1000%           --        -100%
m            12233386/s   227191354%    80281496%     7298227%           --
источник

AG

Anatolia Gr in Modern::Perl
Кажется ошибка
источник

AP

Anton Petrusevich in Modern::Perl
тр быстрее всех по идее
источник

DF

Denis F in Modern::Perl
ну по тесту m рвет все живое
источник

DF

Denis F in Modern::Perl
my $str = "abc\n" x 1048576;
my $lines;
use Benchmark "cmpthese";
cmpthese -1, {
 m => sub {$lines = ($str =~ m/\n/g)},
 tr => sub {$lines = ($str =~ tr/\n//)},
 while_dollar => sub {$lines = 0; $lines++ while $str =~ m/$/gsm},
 while_n => sub {$lines = 0; $lines++ while $str =~ m/\n/gs},
};
источник

DF

Denis F in Modern::Perl
если сделать $lines = () = $str =~ /m/, то тут tr быстрее
источник

DF

Denis F in Modern::Perl
а, понятно, код $lines = ($str =~ m/\n/g) нерабочий, а я думал оптимизаций завезли :(
источник

AP

Anton Petrusevich in Modern::Perl
Denis F
а, понятно, код $lines = ($str =~ m/\n/g) нерабочий, а я думал оптимизаций завезли :(
 perl -E 'my $str = "abc\n" x 1048576;$lines = ($str =~ m/\n/g); say $lines'
1
источник

AP

Anton Petrusevich in Modern::Perl
через =()= работает
источник

DF

Denis F in Modern::Perl
да
источник

DF

Denis F in Modern::Perl
но tr быстрее
источник

AP

Anton Petrusevich in Modern::Perl
               Rate while_dollar           m     while_n     inlinec          tr
while_dollar 5.66/s           --        -49%        -61%        -99%        -99%
m            11.0/s          94%          --        -24%        -97%        -98%
while_n      14.5/s         157%         32%          --        -97%        -97%
inlinec       427/s        7438%       3779%       2833%          --        -15%
tr            504/s        8797%       4478%       3362%         18%          --
источник

AP

Anton Petrusevich in Modern::Perl
тр быстрее даже чем мой вариант на инлайне
источник

DF

Denis F in Modern::Perl
а что у тебя за проц? :) У меня на мобильном и5 цифры в 3 раза ниже почти
источник

AP

Anton Petrusevich in Modern::Perl
3600х
источник

AP

Anton Petrusevich in Modern::Perl
use Inline C => <<'END_OF_C_CODE';
int lines_in_string(SV* sv) {
   int i, lines = 0;
   STRLEN len;
   char *ptr;
   ptr = SvPV(sv, len);
   for(i = 0; i < len; ++i) {
       if(ptr[i] == '\n') ++lines;
   }
   if(len > 0 && ptr[len - 1] != '\n') ++lines;
   return lines;
}

END_OF_C_CODE
источник

AP

Anton Petrusevich in Modern::Perl
что то я не вижу сходу что тут ускорить можно
источник

DF

Denis F in Modern::Perl
посмотри на код tr, там поиск должен быть хорошо оптимизирован
источник

VO

Vyacheslav Olkhovche... in Modern::Perl
Anton Petrusevich
что то я не вижу сходу что тут ускорить можно
использовать векторное
источник