Введите этот код:
#!/usr/bin/env perl
use 5.016;
use warnings;
use autodie;
use Path::Tiny;
use Encode;
use Benchmark qw(:all);
my $cnt = 10_000;
my $utf = 'utf8.txt';
my $res = timethese($cnt, {
'open-UTF-8' => sub {
open my $fhu, '<:encoding(UTF-8)', $utf;
my $stru = do { local $/; <$fhu>};
close $fhu;
},
'open-utf8' => sub {
open my $fhu, '<:utf8', $utf;
my $stru = do { local $/; <$fhu>};
close $fhu;
},
'decode-utf8' => sub {
open my $fhu, '<', $utf;
my $stru = decode('utf8', do { local $/; <$fhu>});
close $fhu;
},
'decode-UTF-8' => sub {
open my $fhu, '<', $utf;
my $stru = decode('UTF-8', do { local $/; <$fhu>});
close $fhu;
},
'ptiny' => sub {
my $stru = path($utf)->slurp_utf8;
},
});
cmpthese $res;
utf8.txt
(приблизительно 175 КБ) содержит 1000 строк символов utf8 encoded/ascii, например:
9áäčďéěíĺľňóôöőŕřšťúůüűýž ÁÄČĎÉĚÍĹĽŇÓÔÖŐŔŘŠŤÚŮÜŰÝŽ aáäbcčdďeéěfghiíjkľĺmnňoóôöőpqrŕřsštťuúůüűvwxyýzž
Запуск выше, на моем ноутбуке дает:
Benchmark: timing 10000 iterations of decode-UTF-8, decode-utf8, open-UTF-8, open-utf8, ptiny...
decode-UTF-8: 47 wallclock secs (46.83 usr + 0.87 sys = 47.70 CPU) @ 209.64/s (n=10000)
decode-utf8: 48 wallclock secs (46.62 usr + 0.90 sys = 47.52 CPU) @ 210.44/s (n=10000)
open-UTF-8: 60 wallclock secs (57.82 usr + 1.20 sys = 59.02 CPU) @ 169.43/s (n=10000)
open-utf8: 7 wallclock secs ( 6.57 usr + 0.70 sys = 7.27 CPU) @ 1375.52/s (n=10000)
ptiny: 7 wallclock secs ( 5.98 usr + 0.52 sys = 6.50 CPU) @ 1538.46/s (n=10000)
Rate open-UTF-8 decode-UTF-8 decode-utf8 open-utf8 ptiny
open-UTF-8 169/s -- -19% -19% -88% -89%
decode-UTF-8 210/s 24% -- -0% -85% -86%
decode-utf8 210/s 24% 0% -- -85% -86%
open-utf8 1376/s 712% 556% 554% -- -11%
ptiny 1538/s 808% 634% 631% 12% --
Для меня удивительно, поэтому вопросы:
- сначала - что-то не так с вышеуказанным кодом?
Если это нормально,
- почему огромная разница между явным
UTF-8
и расслабленнымutf8
, но только на уровне IO-уровня (<:utf8
и<:encoding(UTF-8)
? Итак, - почему разница не такая большая, когда
decode('UTF-8'
иdecode('utf8'
? - почему декодирование уровня ленивого уровня IO намного быстрее, чем явный и ленивый
decode('utf8
? -
и какая "опасность" может использовать расслабленный (быстрый) "utf8" против точного (медленного) "UTF-8"?
-
и, наконец, на самом деле не вопрос - я должен проверить код Path:: Tiny - как это самый быстрый...
Env:
- perl v5.22.0 - perlbrew (threaded)
- OSX - Ядро Дарвина Версия 14.4.0: (yosemite)
- ноутбук старый - MacBook Pro (13-дюймовый, середина 2010) - Core-2-дуэт, 2,4 ГГц, 8 ГБ, медленный жесткий диск