Size: a a a

2021 October 10

VV

Vladimir Varlamov in Modern::Perl
венесите use encode за пределы теста и замените на  encode_utf8, чтобы честно было
источник

SZ

Sergey Zhmylove in Modern::Perl
Надо ведь просто тесты по много раз запускать и усреднять, и доверительный интервал считать
источник

VV

Vladimir Varlamov in Modern::Perl
вообще честно что строка уже точно UTF-8 до замера её длины
источник

VG

Vadim Goncharov in Modern::Perl
сейчас попробую без xs
источник

VG

Vadim Goncharov in Modern::Perl
             Rate encode  svref   utf8  bytes
encode   166779/s     --   -91%   -98%   -99%
svref   1827673/s   996%     --   -80%   -85%
utf8    9282929/s  5466%   408%     --   -25%
bytes  12320105/s  7287%   574%    33%     --
источник

SZ

Sergey Zhmylove in Modern::Perl
Ну, в общем, bytes похоже решает всё же
источник

VG

Vadim Goncharov in Modern::Perl
а падажжи
источник

VG

Vadim Goncharov in Modern::Perl
чому у тебя utf8 => sub { $out = utf8::upgrade($in) },
источник

VG

Vadim Goncharov in Modern::Perl
а длина где?
источник

VV

Vladimir Varlamov in Modern::Perl
$num_octets = utf8::upgrade($string) If $string is already upgraded, then this is a no-op. Returns the number of octets necessary to represent the string as UTF-8.
источник

VG

Vadim Goncharov in Modern::Perl
а, ишь
источник

VV

Vladimir Varlamov in Modern::Perl
так вижу задачу
perl -MBenchmark=/./ -MB=svref_2object -MEncode -Mstrict -Mwarnings -Mutf8 -CSD -le 'my ($in, $out) = Encode::encode(q(UTF-8), qq(\N{GREEK SMALL LETTER SIGMA}x1000)); cmpthese -1 => {bytes => sub { {use bytes; $out = length $in } }, utf8 => sub { $out = utf8::upgrade($in) }, already => sub { $out = length($in) }, svref => sub { $out = svref_2
object(\$in)->CUR }, }'

              Rate   svref    utf8   bytes already
svref    2994789/s      --    -76%    -88%    -91%
utf8    12570647/s    320%      --    -49%    -61%
bytes   24653041/s    723%     96%      --    -23%
already 31913183/s    966%    154%     29%      --
источник

SZ

Sergey Zhmylove in Modern::Perl
Нене, по условию изначально длина считается по utf8 символами
источник

VV

Vladimir Varlamov in Modern::Perl
мм, нет: "нечто генерируют строку добавляя к ней куски текста, надо прекратить, как только длина в байтах результата превысит заданный порог."
байты тут чего и куда? они не используются потом? так не бывает. они куда-то пишутся
источник

SZ

Sergey Zhmylove in Modern::Perl
Смотри: у тебя есть $buf, в который периодически делается .= $newtext. После каждого такого добавления надо проверить длину в байтах. Получается $buf нельзя энкодить заранее.
Хотя конечно если сразу всё энкодить... но это спорно: некоторые дб модули энкодят в любом случае, например, и им нужны данные во внутреннем формате
источник

AT

Artem Tepponen in Modern::Perl
А что у вас за процы? А то у меня вот так (perl 34.0)

perl -MBenchmark=/./ -MB=svref_2object -MEncode -Mstrict -Mwarnings -Mutf8 -CSD -le 'my ($in, $out) = Encode::encode(q(UTF-8), qq(\N{GREEK SMALL LETTER SIGMA}x1000)); cmpthese -1 => {bytes => sub { {use bytes; $out = length $in } }, utf8 => sub { $out = utf8::upgrade($in) }, already => sub { $out = length($in) }, svref => sub { $out = svref_2object(\$in)->CUR }, }'
              Rate   svref    utf8   bytes already
svref     6313100/s      --    -80%    -90%    -96%
utf8     31959500/s    406%      --    -48%    -81%
bytes    61008058/s    866%     91%      --    -64%
already 168574897/s   2570%    427%    176%      --
источник

AT

Artem Tepponen in Modern::Perl
И это довольно старый i7-7700k, чот дохрена разница в скорости
источник

VV

Vladimir Varlamov in Modern::Perl
последнее я на Intel(R) Core(TM) i3-7350K CPU @ 4.20GHz запускал, тестовый сервер
источник

AT

Artem Tepponen in Modern::Perl
Хмм. Очень странная разница в 2-5 раз
источник

VV

Vladimir Varlamov in Modern::Perl
-1 это какая-то там процессорная секунда, я не знаю что это
источник